Zend_Controller_Router_Route_Chain(日本語)
Zend_Controller_Router_Route_Chain は、
複数のルートを一緒にチェーンできるルートです。
これは、たとえばホスト名とルート、パスとルート、または複数のパスとルートをチェーンできます。
チェーンは、プログラム的に、または、構成ファイルの範囲内で行なえます。
パラメータ優先度
ルートを一緒にチェーンするとき、
外側のルートのパラメータは内側のルートのパラメータより高い優先度を持ちます。
そういうわけで、外側のもので、そして、内側のルートでコントローラを定義するなら、
外側のルートのコントローラが選ばれます。
プログラム的にチェーンするとき、これを達成する2つの方法があります。
最初の1つは、 Zend_Controller_Router_Route_Chain
インスタンスを新規作成して、
そして、一緒にチェーンでつながなければならないルートすべてで
chain() メソッドを複数回呼ぶことです。
他の方法は、最初のルート(例えばホスト名のルート)を受け取って、
それに付加されなければならないルートとともに、
そのルート上で chain() メソッドを呼ぶことです。
これはホスト名ルートを修正せずとも、
Zend_Controller_Router_Route_Chain の新規インスタンスを返します。
そして、両方のルートは一緒につながれます。
chain($hostnameRoute)
->chain($pathRoute);
//次の方法では、それらを直接チェーンします。
$chainedRoute = $hostnameRoute->chain($pathRoute);
]]>
ルートを一緒にチェーンするとき、それらの分離記号はデフォルトでスラッシュです。
異なる分離記号にしたい場合があるかもしれません。
chain($secondRoute, '-');
//ルートを結合します: "foo-bar"
echo $chainedRoute->assemble();
]]>
Zend_Configを介したルートのチェーン
構成ファイルでルートをチェーンするために、それらの構成のための付加パラメータがあります。
より単純なアプローチは、 chains パラメータを使うことです。
このものは単にルートの一覧です。そして、それは親ルートでチェーンされます。
親ルートも子供ルートも、結果として生じるチェーンされたルートにだけ直接追加され、
それ以外のルータには追加されません。
ルータでのチェーンされたルートの名前は、
デフォルトでダッシュで連結される親ルート名と子供ルート名です。
XML での単純な構成は、このように見えます。
www.example.com
:language
imprint
users.example.com
:username
misc
]]>
これは結果として、ホスト名及びルート misc に基づいてマッチするだけで、
どんなホスト名ともマッチする3つのルート、
www-language-index 、 www-language-imprint 及び
users-language-profile になります。
チェーンされたルートを作成する別な方法は、
chain パラメータを介することです。
それはチェーン・ルート型とともにのみ直接使うことができ、
さらに root レベルでのみ動作します。
www.example.com
:language
imprint
www, language, index
www, language, imprint
]]>
コンマでルートを分離する代わりに、
配列として chain パラメータを与えることもできます
www
language
index
www
language
imprint
]]>
Zend_Config でチェーン・ルートを構成して、
チェーン名の分離記号をダッシュ以外にしたい場合、
この分離記号を別途指定する必要があります。
array(
'type' => 'Zend_Controller_Router_Route_Static',
'route' => 'foo',
'chains' => array(
'subRouteName' => array(
'type' => 'Zend_Controller_Router_Route_Static',
'route' => 'bar',
'defaults' => array(
'module' => 'module',
'controller' => 'controller',
'action' => 'action'
)
)
)
)
));
//構成追加前にセパレータを設定
$router->setChainNameSeparator('_separator_')
//構成を追加
$router->addConfig($config);
//そしてルート名はこうなります: chainName_separator_subRouteName
echo $this->_router->assemble(array(), 'chainName_separator_subRouteName');
//検証: /foo/bar をエコーします。
]]>