2012-02-22 33 views
0

我在我的zend框架應用中有一個模塊(站點)。我想要做的是首先檢查控制器/操作是否存在,如果不存在,則嘗試將URL與某些自定義路由進行匹配。我的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框架的路由向後匹配。所以我嘗試了以下網址。

  1. example.com/site/index/index - >行(執行動作/控制器=>索引/指數)
  2. example.com/bags/bag-7 - >行(執行動作/控制器= > product/view)
  3. example.com/index/index - > WRONG(執行動作/控制器=>產品/視圖,但是這應該是默認路由的一部分,在最後定義)

這是問題,我不明白爲什麼默認控制器/操作路線未應用。

回答

0

第三個示例與您的catalog_category_product-route的模式相匹配。這就是它發送到產品/視圖的原因。

您可以嘗試將要求添加到:productIdent和/或:categoryIdent,以便索引/索引不符合這些要求。

The reference manual explains how to set variable requirements

編輯:我錯過了,你已經放置了要求。但是索引/索引仍然匹配:categoryIndent /:productIndent。您可以使用以下正則表達式:productIndent,假設它總是字 - 破折號 - 數字:

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

感謝您的回覆mahok。我知道第三個例子與「catalog_category_product」路線相匹配。但它不應該被使用,因爲有默認路由也是匹配的。在第三種情況下,索引/索引是有效的控制器/動作對。這是我正在尋找答案的問題。 – stefan 2012-02-22 14:30:54

+0

在這種情況下,您應該記住,路線匹配的順序是什麼。您的路線會在默認路線之後添加,因此它會在之前匹配(LIFO - 後進先出)。無論如何,更改路線的順序不會對您有所幫助,因爲這會中斷2.因爲它會匹配默認路線。解決你的問題的最好方法(在我看來)是,在你的路由前添加一個靜態文本,比如'catalog /:categoryIdent /:productIdent' [edit:或者在你的路由中有一個更嚴格的要求,我的回答] – dbrumann 2012-02-22 15:50:54

+0

你說我的自定義路由是在默認路由之後添加的,但它不是。正如您在示例代碼中所看到的,我首先刪除默認路由,添加我的自定義路由,然後再次添加我的默認路由。更改路線不是一個選項,因爲那樣我就無法使用默認路線匹配控制器/操作。我知道我可以使用前綴,但我很好奇爲什麼在示例中3號路由不匹配。這是我的問題。無論如何謝謝你的努力。我很感激! – stefan 2012-02-23 10:05:19