2

Zend_Locale と Zend_Translate をモジュール構造に統合するための優れたソリューションをインターネットで検索しました。これが私が望むエンドパスです:

http://url/:lang/:module/:controller/:action
http://url/:lang/:controller/:action
http://url/:module/:controller/:action <= に頼る必要がありますデフォルトのロケール

ルーターを利用したチュートリアルをたくさん見てきましたが、どれもうまくいかないようです。誰かが私のためにこれを解決してください。

ありがとう!

4

1 に答える 1

0

ここでの最初の問題は、ルートを使用する場合、ルールを多くの変数と一致させるために、非常に具体的な制約が必要になることです。

//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 文字の単語のみに制限することもできますが、それは問題を引き起こすため、私はそれを避けたいと考えています。

于 2012-07-24T11:45:57.907 に答える