2017-12-26 7 views
2

私はファルコンの経路に問題があります。私はコードを持っています:ファルコン経路の衝突

$router->add('/{aliascat:[0-9\-a-z\-]+}(/?)', array(
'module' => 'frontend', 
'controller' => 'category', 
'action' => 'view', 
'category' => 1, 
'lang' => 'md', 
))->setName('category_view_cpu'); 

$router->add('/{lang:[' . $langsDefined . ']{2}+}/{aliascat:[0-9\-a-z\-]+}(/?)', array(
'module' => 'frontend', 
'controller' => 'category', 
'action' => 'view', 
'category' => 2, 
'lang' => 1, 
))->setName('category_view_cpu'); 

$router->add('/{controller:[a-z]{3,50}+}(/?)', array(
'module' => 'frontend', 
'controller' => 1, 
'action' => 'index', 
'lang' => 'md', 
))->setName('default_module'); 

$router->add('/{lang:[' . $langsDefined . ']{2}+}/{controller:[a-z]{3,50}+}(/?)', array(
'module' => 'frontend', 
'controller' => 2, 
'action' => 'index', 
'lang' => 1, 
))->setName('default_module_lang'); 

$router->add('/{controller:[a-z]{3,50}+}/:action/', array(
'module' => 'frontend', 
'controller' => 1, 
'action' => 2, 
'lang' => 'md', 
))->setName('default_module_controller_action'); 

$router->add('/{lang:[' . $langsDefined . ']{2}+}/{controller:[a-z]{3,50}+}/:action/', array(
'module' => 'frontend', 
'controller' => 2, 
'action' => 3, 
'lang' => 1, 
))->setName('default_module_controller_action_lang'); 


$router->add('/{controller:[a-z]{3,50}+}/:action/:params/', array(
'module' => 'frontend', 
'controller' => 1, 
'action' => 2, 
'params' => 3, 
'lang' => 'md', 
))->setName('default_module_controller_action_params'); 

$router->add('/{lang:[' . $langsDefined . ']{2}+}/{controller:[a-z]{3,50}+}/:action/:params/', array(
'module' => 'frontend', 
'controller' => 2, 
'action' => 3, 
'params' => 4, 
'lang' => 1, 
))->setName('default_module_controller_action_params_lang'); 

default_moduleルートと競合するため、私はcategoryルートのために細分化されたコントローラを取得します。どのようにしてこの問題を解決できますか?

私はルートを持っている:/カテゴリ名/ とデフォルト:/コントローラ/アクション/ ...ルートと

対立。

1)まず、あなたがそれらの正規表現に2つのハイフンを必要といけない:あなたのコードを読む

答えて

0

は、私が行うことができるいくつかの改良が見つかりました。 [0-9\-a-z\-]の代わりに[0-9a-z\-]と入力します。

2)私は2つの繰り返しの名前があることを確認します。category_view_cpuコピーして貼り付けた後に必ず改訂してください。 ;)

3)ルートのロジックが広すぎるため、あいまいさが発生します。たとえば、category_view_cpuルート(1番目)のルーティング定義と正規表現は、default_moduleルートと非常によく似た動作をします。したがって、1番目のルートでは、英数字の小文字の文字列(オプションのハイフン付き)が必要です。また、default_moduleルートでは、3文字以上の文字のみの文字列も必要です。したがって、yoursite.com/dummyと入力すると、dummy の部分が第1のルートと一致し、default_moduleルートと一致します。 Phalconは、dummyがコントローラかカテゴリエイリアスのいずれかであるかどうかを知る方法を持っていません。

ルートグループを使用するか、または特定のコントローラでのみ処理される特定のルートのコントローラを指定することで、ルートを広範囲にすることはお勧めしません。例:

$router->add('/categories/{alias:[0-9a-z\-]+}(/?)', array(
'module' => 'frontend', 
'controller' => 'categories', 
'action' => 'view', 
'category' => 1, 
'lang' => 'md', 
))->setName('category_view_cpu'); 

次に、このルート^の下で、他のすべての要求をキャッチする汎用/デフォルトルートを定義できます。例:

$router->add('/{controller:[a-z]{3,50}+}(/?)', array(
'module' => 'frontend', 
'controller' => 1, 
'action' => 'index', 
'lang' => 'md', 
))->setName('default_module'); 

何この例でどうなることPhalconが/categoriesのようなURLを取得した場合、それは私が作った最初のルートでそれを一致する、ということです。しかし、それが/dummyのようなルートを取得した場合、それは最初のルートに一致しませんが、私の2番目のルートに一致します。

ルートグループは、ルーティングロジックを区別して分けるのに役立ちます。 https://docs.phalconphp.com/en/3.2/routing#defining-groups-of-routes

+0

しかしカテゴリにはURLを設定する必要があります:site.com/category_name/デフォルトルートではどうすればいいですか? – Jajaja

+0

私の記事をもう一度読んでください。特に、あなたのルートのロジックが広すぎるため、あいまいさが生じます。また、 '' yoursite.com/dummy'と入力すると 'dummy'部分が第1の経路とdefault_moduleの経路と一致しますPhalconは' dummy'がコントローラかカテゴリかを知る方法がありませんエイリアス。" つまり、 'site.com/category_name /'と入力すると、あなたのアプリは 'category_name'がコントローラかカテゴリか分かりません。あなたは英語を学んだので知っていますが、あなたのアプリはそうではありません。あなたは同様の正規表現以外のより良い手がかりを提供する必要があります – YOMorales

+0

また、私は示唆している部分で私の提案を読む: "私は示唆している..." – YOMorales