私のzendフレームワークアプリケーションに1つのモジュール(サイト)があります。私がしようとしているのは、まずコントローラ/アクションが存在するかどうかをチェックし、そうでなければURLをいくつかのカスタムルートと照合しようとします。次のようにMy Zend Frameworkルートが正しくスタックされていません
_bootstrap.phpでの私のコードは次のとおりです。
$router = $this->frontController->getRouter();
$router->removeDefaultRoutes();
// catalog category product route
$route = new Zend_Controller_Router_Route(
':categoryIdent/:productIdent',
array(
'action' => 'view',
'controller' => 'product',
'module' => 'site',
'categoryIdent' => '',
'productIdent' => ''
),
array(
'categoryIdent' => '[a-zA-Z-_0-9]+',
'productIdent' => '[a-zA-Z-_0-9]+'
)
);
$router->addRoute('catalog_category_product', $route);
$router->addDefaultRoutes();
私はZend Frameworkの中にルートが後方一致していることを知っています。だから私は次のURLを試しました。 example.com/site/index/index
- - > OK(実行アクション/コントローラ=>インデックス/インデックス)
- example.com/bags/bag-7 - > OK(アクション/コントローラを実行= > product/view)
- example.com/index/index - > WRONG(アクション/コントローラ=> product/viewを実行しますが、これは最後に定義されているデフォルトルートの一部である必要があります)
これは問題で、デフォルトのコントローラ/アクションルートが適用されない理由はわかりません。
返信いただきありがとうございます。私は3番目の例が "catalog_category_product"ルートと一致していることを認識しています。しかし、それは使用されるべきではありません。なぜなら、マッチしたデフォルトのルートが存在するからです。 3番目のケースでは、index/indexは有効なコントローラ/アクションのペアです。これは私が答えている問題です。 – stefan
その場合、経路がどのような順序で一致しているかを覚えておく必要があります。あなたのルートはデフォルトのルートの後に追加されます。したがって、それは前にマッチします(LIFO-最後に、最初に出ます)。とにかく、ルートの順序を変更すると、デフォルトのルートと一致するため、これが2になるため、あなたを助けません。あなたの問題を解決する最善の方法は、あなたのルートに 'catalog /:categoryIdent /:productIdent'のような静的テキストを接頭辞付けることです。[edit:あなたのルートにもっと厳しい要求がある私の答え] – dbrumann
私のカスタムルートはデフォルトルートの後に追加されていますが、そうではないと言います。サンプルコードでわかるように、まず既定のルートを削除し、カスタムルートを追加してから、既定のルートを再度追加します。ルートを変更することはオプションではありません。デフォルトのルートを使用してコントローラ/アクションを一致させることができないからです。私はプレフィックスを使用できることを知っていますが、この例ではルート番号3が一致しない理由が不思議です。これは私の質問です。とにかく努力してくれてありがとう。それは有り難いです! – stefan