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框架的路由向後匹配。所以我嘗試了以下網址。
- example.com/site/index/index - >行(執行動作/控制器=>索引/指數)
- example.com/bags/bag-7 - >行(執行動作/控制器= > product/view)
- example.com/index/index - > WRONG(執行動作/控制器=>產品/視圖,但是這應該是默認路由的一部分,在最後定義)
這是問題,我不明白爲什麼默認控制器/操作路線未應用。
感謝您的回覆mahok。我知道第三個例子與「catalog_category_product」路線相匹配。但它不應該被使用,因爲有默認路由也是匹配的。在第三種情況下,索引/索引是有效的控制器/動作對。這是我正在尋找答案的問題。 – stefan 2012-02-22 14:30:54
在這種情況下,您應該記住,路線匹配的順序是什麼。您的路線會在默認路線之後添加,因此它會在之前匹配(LIFO - 後進先出)。無論如何,更改路線的順序不會對您有所幫助,因爲這會中斷2.因爲它會匹配默認路線。解決你的問題的最好方法(在我看來)是,在你的路由前添加一個靜態文本,比如'catalog /:categoryIdent /:productIdent' [edit:或者在你的路由中有一個更嚴格的要求,我的回答] – dbrumann 2012-02-22 15:50:54
你說我的自定義路由是在默認路由之後添加的,但它不是。正如您在示例代碼中所看到的,我首先刪除默認路由,添加我的自定義路由,然後再次添加我的默認路由。更改路線不是一個選項,因爲那樣我就無法使用默認路線匹配控制器/操作。我知道我可以使用前綴,但我很好奇爲什麼在示例中3號路由不匹配。這是我的問題。無論如何謝謝你的努力。我很感激! – stefan 2012-02-23 10:05:19