2011-02-14 38 views
1

試想一下情況,當URL應該看起來像Zend_Controller_Router_Route_Regex允許'?'在模式

/catalog/sectionIdent?page=1

其中頁面參數是可選。

當然,應該定義自定義路線。請看下面的代碼:

$route = new Zend_Controller_Router_Route_Regex(
     'catalog/([-a-z]+)(?:\?page=([0-9]*))?', 
     array('controller'=>'catalog','action'=>'list','page'=>''), 
     array(1=>'section',2=>'page'), 
     'catalog/%s?page=%d' 
    ); 
    $router->addRoute('catalog-section-page',$route); 

但是這條路線將不會被觸發「?」符號在網址

沒有'?' (例如,通過在模式中添加轉義的'!'符號),一切都按照它應該的方式工作。 有沒有辦法實現'?'自定義正則表達式路由中的存在?也許我在模式上做錯了什麼?

P.S .:不要提供使用'/'而不是'?',問題與Zend_Controller_Router_Route_Regex實現中的模式限制有關。

回答

2

ZF路由類在查詢字符串被剝離的REQUEST_URI上運行,因此您可能很難以您期望的方式工作。但是,我相信默認情況下,GET參數被放入請求對象中,所以你不需要在你的路由中迎合它們。我建議改變你的路線,以除去查詢字符串部分:

$route = new Zend_Controller_Router_Route_Regex(
    'catalog/([-a-z]+)', 
    array('controller'=>'catalog','action'=>'list'), 
    array(1=>'section'), 
    'catalog/%s' 
); 
$router->addRoute('catalog-section-page',$route); 

您應該仍然能夠訪問在控制器的PARAMS,就好像它們已經由條路由:

public function listAction() 
{ 
    echo $this->_getParam('page'); 
} 

你可以用同樣的方法設置默認:

public function listAction() 
{ 
    $page = $this->_getParam('page', 1); // defaults to 1 if no page in URL 
} 

你只需要清理他們那裏(確保它們是數字)。

編輯:

與這條路線網址助手的例子:

echo $this->url(array('section' => 'foo', 'page' => 2), 'catalog-section-page') 
+0

事實上,我使用Zend網址視圖助手在我的意見後建立的網址 - 這樣的問題仍未得到解決。 考慮到你的代碼,最好將默認值添加到section參數中,甚至是空的('section'=>'') - 如果以後在視圖中沒有使用此自定義路由傳遞段,則Zend Url視圖幫助程序將通過錯誤。 – BasTaller 2011-02-23 16:54:39