2012-02-22 10 views
0

私の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

  1. - > OK(実行アクション/コントローラ=>インデックス/インデックス)
  2. example.com/bags/bag-7 - > OK(アクション/コントローラを実行= > product/view)
  3. example.com/index/index - > WRONG(アクション/コントローラ=> product/viewを実行しますが、これは最後に定義されているデフォルトルートの一部である必要があります)

これは問題で、デフォルトのコントローラ/アクションルートが適用されない理由はわかりません。

答えて

0

3番目の例は、catalog_category_product-routeのパターンと一致します。それが製品/ビューに送信される理由です。

index/indexがこれらの要件と一致しないように、productIdentおよび/または:categoryIdentに要件を追加しようとすることができます。

The reference manual explains how to set variable requirements

編集:私はあなたがすでに要件を置いていたのを逃しました。しかし、index/indexはまだ一致します:categoryIndent /:productIndent。次の正規表現を使用できます:productIndent、常にword-dash-numberであることを前提とします。

'/^([a-z]+-[0-9]+)$/' 
+0

返信いただきありがとうございます。私は3番目の例が "catalog_category_product"ルートと一致していることを認識しています。しかし、それは使用されるべきではありません。なぜなら、マッチしたデフォルトのルートが存在するからです。 3番目のケースでは、index/indexは有効なコントローラ/アクションのペアです。これは私が答えている問題です。 – stefan

+0

その場合、経路がどのような順序で一致しているかを覚えておく必要があります。あなたのルートはデフォルトのルートの後に追加されます。したがって、それは前にマッチします(LIFO-最後に、最初に出ます)。とにかく、ルートの順序を変更すると、デフォルトのルートと一致するため、これが2になるため、あなたを助けません。あなたの問題を解決する最善の方法は、あなたのルートに 'catalog /:categoryIdent /:productIdent'のような静的テキストを接頭辞付けることです。[edit:あなたのルートにもっと厳しい要求がある私の答え] – dbrumann

+0

私のカスタムルートはデフォルトルートの後に追加されていますが、そうではないと言います。サンプルコードでわかるように、まず既定のルートを削除し、カスタムルートを追加してから、既定のルートを再度追加します。ルートを変更することはオプションではありません。デフォルトのルートを使用してコントローラ/アクションを一致させることができないからです。私はプレフィックスを使用できることを知っていますが、この例ではルート番号3が一致しない理由が不思議です。これは私の質問です。とにかく努力してくれてありがとう。それは有り難いです! – stefan

関連する問題