ここでの最初の問題は、ルートを使用する場合、ルールを多くの変数と一致させるために、非常に具体的な制約が必要になることです。
//url/:lang/:module/:controller/:action と //url/:module/:controller/:action の両方を受け入れる代わりに、最初の構造のみを使用することをお勧めします。こうすることで、この //url/:lang/:controller/:action から最初のルールを分離しやすくなり、それぞれ異なる「単語」(URL 部分) を持つルールが 2 つだけになります。
$withModule = new Zend_Controller_Router_Route(
':lang/:module/:controller/:action',
array()
);
$withoutModule = new Zend_Controller_Router_Route(
':lang/:controller/:action',
array(
'module' => 'default'
)
);
$router->addRoute('withModule', $withModule);
$router->addRoute('withoutModule', $withoutModule);
最初のルートではデフォルトを指定しないため、2 番目のルートで意図された URL と一致しませんが、2 番目のルートではモジュールをデフォルトに設定します (ZF がその情報を必要とするため)。
3 番目のルールについては、MyLib_Controller のようなベース 祖先コントローラーを使用し、その init() メソッドで、以下の例のように言語パラメーターが受信されているかどうかを確認することをお勧めします。
if(!$this->_getParam('lang')) {
//this should cover the 3rd use case
$this->_redirect('/en/' + $this->view->url(), array('exit' => true, 'prependBase' => false));
} else {
//setup Zend_Translate
}
別の可能性として、:lang 変数を 2 文字の単語のみに制限することもできますが、それは問題を引き起こすため、私はそれを避けたいと考えています。