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-indexwww-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 をエコーします。 ]]>