2012-05-13 63 views
0

我正在定義用於清理我的URL的正則表達式路由。這個想法是,用戶添加的所有頁面將使用URL www.example.com/page-slug,而不是使用實際的控制器www.example.com/userpages/page-slug。其他頁面將遵循標準模塊:控制器:動作路由方案。正則表達式路由 - 規則未找到

我正在嘗試使用路由器優先級。

我已經定義了以下方案..

class Default_Bootstrap extends Zend_Application_Module_Bootstrap{ 

protected function _initRoute() { 

    $front = Zend_Controller_Front::getInstance(); 
    $router = $front->getRouter(); // returns a rewrite router by default 

    $route['index'] = new Zend_Controller_Router_Route_Regex(
     '/', 
     array(
     'module'  => 'default', 
     'controller' => 'index', 
     'action'  => 'index' 
     ) 
    ); 
    $route['contact'] = new Zend_Controller_Router_Route_Regex(
     'contact/(\d+)', 
     array(
     'module'  => 'default', 
     'controller' => 'contact', 
     'action'  => 'index' 
     ) 
    ); 
    $route['research'] = new Zend_Controller_Router_Route_Regex(
     'research/(\d+)', 
     array(
     'module'  => 'default', 
     'controller' => 'research', 
     'action'  => 'index' 
     ) 
    ); 
    $route['account'] = new Zend_Controller_Router_Route_Regex(
     'account/(\d+)', 
     array(
     'module'  => 'default', 
     'controller' => 'account', 
     'action'  => 'index' 
     ) 
    ); 
    $route['userpages'] = new Zend_Controller_Router_Route_Regex(
     '/(.+)', 
     array(
     'module'  => 'default', 
     'controller' => 'userpages', 
     'action'  => 'index' 
     ), 
     array(
     'slug' => 1 
     ), 
     '%s' 
    ); 

    $router->addRoute('userpages',  $route['userpages']); 
    $router->addRoute('contact',  $route['contact']); 
    $router->addRoute('research',  $route['research']); 
    $router->addRoute('account',  $route['account']); 
    $router->addRoute('index',   $route['index']); 

} 

} 

的東西,一般工作正常與路由器的優先級,確保指數/帳號/科研/聯繫人頁面拿起正確的控制器。但是,當試圖訪問由「用戶頁面」路線覆蓋的URL時「關於美」,最終捕獲所有路線沒有被發現導致...

Message: Invalid controller specified (about-us) 
. 
. 
. 
Request Parameters: 

array (
    'controller' => 'about-us', 
    'action' => 'index', 
    'module' => 'default', 
) 

任何想法,我要去哪裏錯在這裏?在我看來,正則表達式是正確的「/(.+)」應該捕捉不是索引頁面的東西。

編輯:@phatfingers,OK,你說得對,我已經編輯「\ d +」來捕捉一個或多個任意字符「+」。問題依然存在。事實上,在更改正則表達式之前,我嘗試了URL www.example.com/52,並得到了同樣的錯誤 - 「指定的控制器無效(52)」。更改後 - 根據上述編輯過的代碼,該規則仍無法找到任何匹配。

+0

正則表達式 「(\ d +)」 只匹配數字。示例網址「www.example.com/page-slug」不以數字結尾。 – phatfingers

+0

感謝觀察@phatfingers,看到我的編輯以上 - 這個規則還是不匹配預期的位置 – NaNuk

+0

我認爲你必須放棄正斜槓在「userpages」正則表達式,即只是'(」 +)' –

回答

0

下降正斜槓在「userpages」正則表達式,即只(」 +)

的報價是直接從手動Zend Router和Router_Regex,但據我所知它也適用於所有的路由。

注意:在匹配之前,前導斜槓和結尾斜槓從 路由器的URL中刪除。因此,匹配URL http://domain.com/foo/bar/將涉及foo/bar的正則表達式,而不是 /foo/bar。