1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 21661 -->
4 <sect3 id="zend.controller.router.routes.standard">
5 <title>Zend_Controller_Router_Route</title>
8 <classname>Zend_Controller_Router_Route</classname> はフレームワークの標準のルートです。
9 簡単に利用でき、柔軟なルート定義が可能です。各ルートには、まず
10 (静的および動的な) <acronym>URL</acronym> のマッピングが含まれ、
11 そしてデフォルト値および変数についての制限を指定して初期化します。
15 とある架空のアプリケーションで、コンテンツの作者情報のページが必要になったとしましょう。
16 ブラウザで <filename>http://domain.com/author/martel</filename>
17 にアクセスした際に、"martel" とかいう人についての情報を見たいわけです。
18 この機能を実現するためのルートは、次のようになります。
21 <programlisting language="php"><![CDATA[
22 $route = new Zend_Controller_Router_Route(
25 'controller' => 'profile',
26 'action' => 'userinfo'
30 $router->addRoute('user', $route);
34 <classname>Zend_Controller_Router_Route</classname>
35 のコンストラクタの最初のパラメータは、ルートの定義です。
36 これを <acronym>URL</acronym> にマッチさせます。ルート定義は静的な部分と動的な部分で構成され、
37 それをスラッシュ ('/') で連結します。
38 静的な部分は単なるテキスト (例. <command>author</command>) です。
39 動的な部分を変数と呼び、変数名の前にコロンをつけて
40 (例. <command>:username</command>) 表します。
48 任意の文字を変数名として使用できます。しかし、
49 <acronym>PHP</acronym> の変数名として使用できる文字だけを用いることを強く推奨します。
51 将来実装が変更されたときにバグを引き起こす可能性を抑えられます。
57 <filename>'http://domain.com/author/martel'</filename> を指した際にマッチします。
58 この場合、すべての変数の値が <classname>Zend_Controller_Request</classname>
59 オブジェクトに注入され、<classname>ProfileController</classname> からアクセスできるようになります。
60 この例が返す変数は、以下のようなキーと値のペアを持つ配列となります。
63 <programlisting language="php"><![CDATA[
65 'username' => 'martel',
66 'controller' => 'profile',
67 'action' => 'userinfo'
72 その後、<classname>Zend_Controller_Dispatcher</classname> は
73 (デフォルトモジュールの) <classname>ProfileController</classname> クラスにある
74 <methodname>userinfoAction()</methodname> メソッドを実行します。変数にアクセスするには、
75 <methodname>Zend_Controller_Action::_getParam()</methodname> あるいは
76 <methodname>Zend_Controller_Request::getParam()</methodname> メソッドを使用します。
79 <programlisting language="php"><![CDATA[
80 public function userinfoAction()
82 $request = $this->getRequest();
83 $username = $request->getParam('username');
85 $username = $this->_getParam('username');
90 ルート定義には、特殊文字 (ワイルドカード)
91 を含めることができます。これは '*' 記号で表します。
92 これを使用して、Module ルートと同様にパラメータを扱う
93 (変数名 => 値 のペアを <acronym>URI</acronym> で定義する) ことができます。
94 次のルートは、Module ルートの挙動をまねたものです。
97 <programlisting language="php"><![CDATA[
98 $route = new Zend_Controller_Router_Route(
99 ':module/:controller/:action/*',
100 array('module' => 'default')
102 $router->addRoute('default', $route);
105 <sect4 id="zend.controller.router.routes.standard.variable-defaults">
106 <title>変数のデフォルト</title>
109 ルートで使用するすべての変数についてデフォルト値を指定できます。
110 これは、 <classname>Zend_Controller_Router_Route</classname>
111 のコンストラクタの 2 番目のパラメータで指定します。
112 このパラメータは、変数名をキーとする配列で、
113 対応する値にそのデフォルト値を指定します。
116 <programlisting language="php"><![CDATA[
117 $route = new Zend_Controller_Router_Route(
119 array('year' => 2006)
121 $router->addRoute('archive', $route);
125 上のルートは <filename>'http://domain.com/archive/2005'</filename> および
126 <filename>'http://example.com/archive'</filename>
127 のような <acronym>URL</acronym> にマッチします。後者の場合、変数 year にはデフォルト値である
132 この例は、year 変数をリクエストオブジェクトに注入することになります。
134 (コントローラやアクションのパラメータが定義されていない) ので、
135 アプリケーションはデフォルトのコントローラのデフォルトアクションメソッド
136 (ともに <classname>Zend_Controller_Dispatcher_Abstract</classname> で定義されています)
137 にディスパッチします。より使いやすくするには、
138 ルートのデフォルトとしてコントローラとアクションを定義しておく必要があります。
141 <programlisting language="php"><![CDATA[
142 $route = new Zend_Controller_Router_Route(
146 'controller' => 'archive',
150 $router->addRoute('archive', $route);
154 このルートは、<classname>ArchiveController</classname> の
155 <methodname>showAction()</methodname> を実行します。
160 <sect4 id="zend.controller.router.routes.standard.variable-requirements">
164 <classname>Zend_Controller_Router_Route</classname> のコンストラクタの
165 三番目のパラメータで、変数の制約を指定できます。
169 <programlisting language="php"><![CDATA[
170 $route = new Zend_Controller_Router_Route(
174 'controller' => 'archive',
177 array('year' => '\d+')
179 $router->addRoute('archive', $route);
183 上の例のルートでは、year 変数の値が数値データである場合にのみ
184 Rewrite ルータにマッチします。つまり
185 <filename>http://domain.com/archive/2345</filename> はマッチしますが
186 <filename>http://example.com/archive/test</filename> はマッチしません。
187 この場合はチェイン内の次のルートに処理を移します。
191 <sect4 id="zend.controller.router.routes.standard.translated-segments">
192 <title>翻訳済みセグメント</title>
195 標準のルートは、翻訳済みセグメントをサポートします。この機能を使用するには、
196 次のいずれかの方法で翻訳器 (<classname>Zend_Translate</classname> のインスタンス)
203 レジストリに、キー <classname>Zend_Translate</classname> で格納する
210 <methodname>Zend_Controller_Router_Route::setDefaultTranslator()</methodname> で設定する
216 コンストラクタの 4 番目のパラメータとして渡す
222 デフォルトでは、<classname>Zend_Translate</classname>
223 のインスタンスで指定したロケールを使用します。これを上書きするには、
224 (<classname>Zend_Locale</classname> のインスタンスあるいはロケール文字列で)
231 レジストリに、キー <classname>Zend_Locale</classname> で格納する
238 <methodname>Zend_Controller_Router_Route::setDefaultLocale()</methodname> で設定する
244 コンストラクタの 5 番目のパラメータとして渡す
250 アセンブルメソッドのパラメータ <command>@locale</command> として渡す
256 翻訳済みセグメントはふたつの部分に分かれます。
257 固定セグメントの前には <emphasis>@</emphasis> 記号がひとつつき、
259 マッチングの際にはメッセージ ID に戻されます。
260 動的セグメントの前には <command>:@</command> がつきます。
261 アセンブルの際に、指定したパラメータが翻訳され、
263 マッチングの際には、<acronym>URL</acronym> の翻訳済みパラメータが
268 <title>メッセージ ID と分割された言語ファイル</title>
271 ルートの中で使いたいメッセージ ID が、
272 ビュースクリプトやその他の部分ですでに使われていることもあるでしょう。
273 <acronym>URL</acronym> の安全性を確保するには、
274 ルートで使用するメッセージを別の言語ファイルに分割しなければなりません。
279 標準のルートで翻訳済みセグメントを使用するための準備として
280 もっともシンプルな方法は、次のようになります。
283 <programlisting language="php"><![CDATA[
285 $translator = new Zend_Translate(
287 'adapter' => 'array',
288 'content' => array(),
292 $translator->addTranslation(
296 'archive' => 'archiv',
299 'index' => 'uebersicht'
306 $translator->setLocale('en');
308 // ルートのデフォルト翻訳器として設定します
309 Zend_Controller_Router_Route::setDefaultTranslator($translator);
316 <programlisting language="php"><![CDATA[
318 $route = new Zend_Controller_Router_Route(
321 'controller' => 'archive',
325 $router->addRoute('archive', $route);
327 // URL をデフォルトのロケールでアセンブルします: archive
328 $route->assemble(array());
330 // URL をドイツ語でアセンブルします: archiv
331 $route->assemble(array());
336 モジュールルートの翻訳済みバージョンを作ることができます。
339 <programlisting language="php"><![CDATA[
341 $route = new Zend_Controller_Router_Route(
342 ':@controller/:@action/*',
344 'controller' => 'index',
348 $router->addRoute('archive', $route);
350 // URL をデフォルトのロケールでアセンブルします: archive/index/foo/bar
351 $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
353 // URL をドイツ語でアセンブルします: archiv/uebersicht/foo/bar
354 $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
358 静的セグメントと動的セグメントを同時に使用することもできます。
361 <programlisting language="php"><![CDATA[
363 $route = new Zend_Controller_Router_Route(
364 '@archive/:@mode/:value',
368 'controller' => 'archive',
371 array('mode' => '(month|year)'
374 $router->addRoute('archive', $route);
376 // URL をデフォルトのロケールでアセンブルします: archive/month/5
377 $route->assemble(array('mode' => 'month', 'value' => '5'));
379 // URL をドイツ語でアセンブルします: archiv/monat/5
380 $route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de'));