1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 17592 -->
4 <sect3 id="zend.controller.router.routes.regex">
5 <title>Zend_Controller_Router_Route_Regex</title>
8 デフォルトのルートや静的なルートに加えて、正規表現によるルートも使用可能です。
9 このルートは他のものに比べてより強力で柔軟なものですが、
10 多少複雑になってしまいます。そして、より高速になります。
14 標準のルートと同様、このルートを初期化する際にはルートの定義とデフォルトを指定する必要があります。
15 サンプルとして、archive ルートを作成してみましょう。
16 これは先ほど定義したものとほぼ同じですが、今回は Regex ルートを使用しています。
19 <programlisting language="php"><![CDATA[
20 $route = new Zend_Controller_Router_Route_Regex(
23 'controller' => 'archive',
27 $router->addRoute('archive', $route);
31 定義された正規表現のパターンが、リクエストオブジェクトに注入されます。
32 上の例では、<filename>http://domain.com/archive/2006</filename>
33 がマッチした後の結果の値は次のような配列になります。
36 <programlisting language="php"><![CDATA[
39 'controller' => 'archive',
46 ルータとのマッチングを行う前に、<acronym>URL</acronym> の先頭と最後のスラッシュは取り除かれます。
47 結果として、<acronym>URL</acronym> <filename>http://domain.com/foo/bar/</filename>
48 は正規表現 <filename>foo/bar</filename> にマッチすることになります。
49 <filename>/foo/bar</filename> にはマッチしません。
55 行頭と行末を表す文字 (それぞれ '^' および '$')
56 が、すべての式の前後に自動的に付加されます。
57 したがって、これらは正規表現で指定する必要はありません。
63 このルートクラスは、区切り文字として '<emphasis>#</emphasis>' を使用します。
64 つまり、ルート定義の中にハッシュ文字 ('#')
65 がある場合は、それをエスケープする必要があるということです。
66 スラッシュ ('/') をエスケープする必要はありません。
67 '#' (アンカー) は通常はウェブサーバに渡されることはないので、
68 エスケープが必要になることはまずないでしょう。
73 定義されたサブパターンの内容は、通常通りの方法で取得できます。
76 <programlisting language="php"><![CDATA[
77 public function showAction()
79 $request = $this->getRequest();
80 $year = $request->getParam(1); // $year = '2006';
85 <para>このキーは、文字列 ('1') ではなく数値の 1 であることに注意しましょう。</para>
89 このルートは、標準のルートとまったく同様に動作するわけではありません。
90 'year' のデフォルトが設定されていないからです。
91 また、year のデフォルトを設定してこれをオプション扱いにしたとしても、
92 最後のスラッシュをどうするかという問題が残ります。
93 これを解決するには、year 部をスラッシュを含めてオプションにし、
97 <programlisting language="php"><![CDATA[
98 $route = new Zend_Controller_Router_Route_Regex(
102 'controller' => 'archive',
106 $router->addRoute('archive', $route);
110 まだ問題が残っていることにおそらくお気づきでしょう。
111 パラメータとして数値のキーを使用するのはなかなか難しく、
112 長い目で見れば問題を引き起こす可能性が高くなります。
114 このパラメータは、正規表現サブパターンとパラメータ名のキーを関連付けます。
118 <programlisting language="php"><![CDATA[
119 $route = new Zend_Controller_Router_Route_Regex(
122 'controller' => 'archive',
129 $router->addRoute('archive', $route);
133 この結果は次のようになり、これがリクエストオブジェクトに格納されます。
136 <programlisting language="php"><![CDATA[
139 'controller' => 'archive',
145 関連付けは両方の方法で定義でき、任意の環境 (例. Zend_Config) で動作します。
146 キーには変数名あるいはサブパターン番号のいずれかを含めることができます。
149 <programlisting language="php"><![CDATA[
150 $route = new Zend_Controller_Router_Route_Regex(
158 $route = new Zend_Controller_Router_Route_Regex(
167 サブパターンのキーは整数値でなければなりません。
172 リクエストの値から数値キーが消え、代わりに名前がつけられたことに注目しましょう。
173 もちろん、お望みなら数値での指定と名前での指定を共用することもできます。
176 <programlisting language="php"><![CDATA[
177 $route = new Zend_Controller_Router_Route_Regex(
178 'archive/(\d+)/page/(\d+)',
185 この結果、リクエスト内には数値キーと名前つきキーが共存することになります。
186 たとえば、<acronym>URL</acronym> <filename>http://domain.com/archive/2006/page/10</filename>
190 <programlisting language="php"><![CDATA[
194 'controller' => 'archive',
200 正規表現を簡単に反転させることはできないので、
201 <acronym>URL</acronym> ヘルパーやこのクラスのメソッドを使用するには
202 逆の <acronym>URL</acronym> を準備しておく必要があります。
203 逆方向のパスは <methodname>sprintf()</methodname> 形式の文字列で表し、
204 コンストラクタの四番目のパラメータとして指定します。
207 <programlisting language="php"><![CDATA[
208 $route = new Zend_Controller_Router_Route_Regex(
217 これまで説明してきたことは、すべて標準のルートオブジェクトでも可能なことです。
218 それでは、Regex ルートを使用するメリットはいったい何なのでしょう?
219 これを使用すると、あらゆる形式の <acronym>URL</acronym> を制約なしに定義することができます。
221 <filename>http://domain.com/blog/archive/01-Using_the_Regex_Router.html</filename>
222 のような <acronym>URL</acronym> を作成したいと考えたとしましょう。
223 このパスの最後の要素 <filename>01-Using_the_Regex_Router.html</filename>
224 から記事の ID とタイトル/説明 を取得するにはどうしたらいいでしょうか?
225 標準のルートでは不可能でしょう。Regex ルートを使用した場合は、
229 <programlisting language="php"><![CDATA[
230 $route = new Zend_Controller_Router_Route_Regex(
231 'blog/archive/(\d+)-(.+)\.html',
233 'controller' => 'blog',
240 'blog/archive/%d-%s.html'
242 $router->addRoute('blogArchive', $route);
246 regex ルートは標準のルートよりはるかに柔軟性があるということが、