2012-02-24 22 views
5

ルーティングとZendのドキュメントに関するすべての記事を読みましたが、この問題は解決できません。Zendルーティングの問題

私は、デフォルトと管理という2つのモジュールを持つ多言語アプリケーションを持っています。言語の選択は、(コントローラrouteShutdownプラグインで)正常に動作しているが、私はルータを設定するいくつかの問題を持っている:

私はこれらのURLの作業がしたい:

/ 
/controller 
/controller/action 
/action     (default controller) 
/controller/param  (default action) 
/admin 
/admin/admin-controller 
/admin/admin-controller/action 

、それは次のようになり、言語セレクタを使用して:

/en 
/en/controller 
/en/controller/action 
/en/action     (default controller) 
/en/controller/param  (default action) 
/en/admin/admin-controller 
/en/admin/admin-controller/action 

私はbootstapファイル(index.phpを)にこれを追加しました:

$frontController = Zend_Controller_Front::getInstance(); 
$router = $frontController->getRouter(); 
$router->removeDefaultRoutes(); 
$router->addRoute('langmodcontrolleraction', 

new Zend_Controller_Router_Route('/:lang/:module/:controller/:action', 
    array('lang' => ':lang')) 
); 

$router->addRoute('langmodcontroller', 
new Zend_Controller_Router_Route('/:lang/:module/:controller', 
    array('lang' => ':lang', 
     'action' => 'index')) 
); 

$router->addRoute('langmod', 
new Zend_Controller_Router_Route('/:lang/:module', 
    array('lang' => ':lang', 
     'action' => 'index', 
     'controller' => 'index')) 
); 

$router->addRoute('lang', 
new Zend_Controller_Router_Route('/:lang', 
    array('lang' => ':lang', 
     'action' => 'index', 
     'controller' => 'index', 
     'module' => 'default')) 
); 

$frontController->setControllerDirectory(array(
'default'=>BASE_PATH.'app/modules/default/controllers', 
'admin'=>BASE_PATH.'app/modules/admin/controllers'));  

は、ルータがURLを解析しているかをチェックするためには、私はrouteShutdownプラグインへのvar_dumpを追加しました:

はアン/に入ると、私が手:

array 
'lang' => string 'en' (length=2) 
'action' => string 'index' (length=5) 
'controller' => string 'index' (length=5) 
'module' => string 'default' (length=7) 

OKです。私は/EN/controller1に入力すると、しかし、私は得る:

array 
'lang' => string 'en' (length=2) 
'module' => string 'controller1' (length=8) 
'action' => string 'index' (length=5) 
'controller' => string 'index' (length=5) 

それは "controller1" にモジュールを設定しています。ルータにモジュールにデフォルト値を設定するように指示するにはどうすればよいですか?/en/controller/paramのようなURLの場合は? (モジュールとアクションをデフォルトに設定する)

答えて

6

URLスキームを少し再考するか、ルートの設定方法を変更する必要があります.ZFの方法の2つの制限がありますルーティングが機能します。

第1の点は、ルータが有効なモジュール、コントローラ、またはアクションが何であるか、ないかを知っていないことです。 URL内の文字列とルート内の変数が一致します。これは、一致するまで、逆順に各ルートを連続してチェックすることによって行います。あなたが/en/controllerにヒットすると、最初にあなたの/:langルートをチェックします。一致しません。その後、/:lang/:moduleが一致するかどうかを確認します。これは、別の方法で指示しない限り、/:lang/:moduleは/ anything/anythingと一致します。念頭に置いて

あなたは両方を持ってすることはできません。

/en/controller 
/en/action 

あなたには、いくつかの制限を設定しない限り、/en/fooのようなURLは、常にあなたが最後に定義する2つのどちらかによって一致されるように。

あなたが頻繁に変更しないアクション/コントローラのかなり数が少ない場合は、これを回避する最も簡単な方法は、二つの経路、例えば第二のためのいくつかの可能な値にハードコーディングすることです:

$router->addRoute('langmod', new Zend_Controller_Router_Route(
    '/:lang/:module', 
    array(
     'lang' => ':lang', 
     'action' => 'index', 
     'controller' => 'index' 
    ), 
    array(
     'module' => '(foo|bar|something)' 
    ) 
)); 

foo、barなどを有効なモジュール名に置き換えます。 /en/controller1を押すと、controller1が:module変数に定義された正規表現パターンと一致しないため、このルートと一致しません。その場合は、代わりに別の/:lang/:controllerルート(または可能であれば/:lang/:controller/:action)が必要です。

いくつかの変数にどのようにデフォルト値を設定するか尋ねました。あなたは実際にあなたのルートのいくつかのアクションでこれをやっていますが、コントローラ/モジュールのためにはあなたが望むやり方ではうまくいかないでしょう。もし私たちがあなたのlangmodcontrollerルートを取ってこれを以下のように変更したら:コントローラ変数のデフォルト値があります。これが唯一のルートであると思われる場合、/en/blogの要求がこれと一致し、要求パラメータをlang = en、module = blog、controller = index、action = indexに設定します。 /en/blog/index/fooもこのルートと一致し、module = blog、controller = index、action = fooと表示されます。ただし、controller = indexの場合でも、URLにはまだそれが必要です。したがって、2番目の制限は、デフォルト以外のものがある限り、URLに変数が必要(デフォルトに設定されていても)です。

/:lang/:controller/:action/ (with 'index' defaults for controller and action) 
/:lang/:action (with 'action' restricted to some predefined values) 
/:lang/admin/:controller/:action (with 'admin' as a string in the URL, and :module set to 'admin' as the default) 

これは、このようにあなたのURLを与えるだろう:

/en 
/en/controller 
/en/controller/action 
/en/action 
/en/controller/param 
/en/admin/controller 
/en/admin/controller/action 

です念頭に置いて、これらの制限付き

私はあなたがこのような何か(この順序で定義されている)と一緒に行くことをお勧めしたいですあなたが何をしているのか

ZFのルーティングは非常に強力です。あなたはその癖を知る必要があります。

+0

これは非常に有用な答えです。あなたの説明は完璧です。今はルーティングの仕組みを理解しました:)ありがとうございます!私が15の担当者に達すると。あなたの答えに投票します。ここに私のウェブサイトがあります。ここで私はこれを実装します:[tryandsay.com](http://www.tryandsay.com) – Gustavo