2012-03-23 26 views
3

我已經使用正則表達式成功創建了我的路線。我的路由中有幾個可選參數,除非用戶指定了它們,否則我不想在URL Helper中顯示這些參數。我怎樣才能做到這一點?Zend_Controller_Router_Route_Regex具有反向的可選參數

這是我目前有

 $route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
     array(
      'controller' => 'widget', 
      'action'  => 'list', 
     ), 
     array(
      1 => 'color', 
      2 => 'page', 
      3 => 'limit' 

     ), 
     '%s-Widgets/' 
    ); 

    $router->addRoute('color_widgets', $route); 

我然後調用URL助手用下面的代碼

 echo $this->url(array('page' => $page), 'color_widgets', false); 

這導致/藍色小工具/和頁面不會發送到URL 。我可以通過改變反向的路由器

$route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
     array(
      'controller' => 'widget', 
      'action'  => 'list', 
      'page'  => 1 
     ), 
     array(
      1 => 'color', 
      2 => 'page', 
      3 => 'limit' 

     ), 
     '%s-Widgets/page/%d' 
    ); 

然而,這並沒有解決我的問題,解決這個問題說,我有一個網址

/藍色小工具/頁/ 1 /極限/ 10的限制沒有按「T秀,我又可以解決這個問題有以下

$route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
     array(
      'controller' => 'widget', 
      'action'  => 'list', 
      'page'  => 1, 
      'limit'  => 10 
     ), 
     array(
      1 => 'color', 
      2 => 'page', 
      3 => 'limit' 

     ), 
     '%s-Widgets/page/%d/limit/%d' 
    ); 

的問題,這是用戶在 /藍色小工具/我想帶他們到藍色小工具的下一個頁面下面的代碼

 echo $this->url(array('page' => $page), 'color_widgets', false); 

他們實際上採取 /藍小工具/頁/ 2 /極限/ 10

當我真的想帶他們到 /藍小工具/頁/ 2

哪有我用Zend Framework完成了這個任務。

回答

2

不可能使用具有可變數量值的正則表達式反向路由。 你可以:

  1. 寫每一個可選參數(不推薦)
  2. 使用不同的路由結構

,你可以不同的路線,例如路線更改爲:

$route = new Zend_Controller_Router_Route(
    'widgets/:color/*', 
    array(
     'controller' => 'widget', 
     'action'  => 'list', 
     'page'  => 1, 
     'limit'  => 10 
    ), 
    array(
     'color' => '[a-zA-Z-_0-9-]+', 
     'page' => '\d+', 
     'limit' => '\d+', 
    ) 
); 

另一種選擇是創建自己的自定義路由類,它可以解析和構建正確的uri。

+0

謝謝我試圖避免必須編寫自定義路由。我會嘗試使用Router_Route。 – user1287238 2012-03-23 21:31:32

0

你給錯了正則表達式匹配變量索引,這就是爲什麼你得到奇怪的結果。您的代碼應該看起來像這樣:

$route = new Zend_Controller_Router_Route_Regex(
'([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
array(
    'controller' => 'widget', 
    'action'  => 'list', 
), 
array(
    1 => 'color', 
    3 => 'page', 
    5 => 'limit' 
), 
'%s-Widgets/' 
); 

$router->addRoute('color_widgets', $route);