2012-03-24 96 views
1

在的application.ini我有缺省路由Zend的默認路由掩碼無效模塊

resources.router.routes.default.type = "Zend_Controller_Router_Route" 
resources.router.routes.default.route = ":lang/:module/:controller/:action/*" 
resources.router.routes.default.defaults.module = "default" 
resources.router.routes.default.defaults.controller = "index" 
resources.router.routes.default.defaults.action = "index" 
resources.router.routes.default.defaults.lang = "" 

的問題是,它似乎這在某種程度上掩蓋無效模塊404錯誤。例如,像「/ en/mmm」這樣的url請求會被路由到默認/索引/索引。但是對於「/ en/mmm/ccc」無效控制器被觸發。

謝謝!

回答

0

附近,我可以告訴,這種行爲是正常的。

我一直在看文檔和代碼,似乎路由器會像/en/mmm這樣的URL加載默認控制器/動作。 lang:en有效,但mmm與有效模塊或控制器不匹配,因此使用默認路由。

en/mmm/ccc的情況下它拋出一個404因爲在沒有一個有效的模塊的路徑將是對控制器/動作的比賽,並因爲值是無效將導致404我知道爲什麼這導致404和一個無效的控制器只會導致被調用的默認路由。

這個活動顯示出在這些例子學位Default Routes

// Assuming the following: $ctrl->setControllerDirectory(
    array(
     'default' => '/path/to/default/controllers', 
     'news' => '/path/to/news/controllers', 
     'blog' => '/path/to/blog/controllers' 
    )); 

Module only: http://example/news 
//if not valid module would attempt to match controller. 
//if not valid controller would call default route 
    module == news 

Invalid module maps to controller name: http://example/foo 
    controller == foo 

Module + controller: http://example/blog/archive 
    module  == blog 
    controller == archive 

Module + controller + action: http://example/blog/archive/list 
//all three must be valid or 404 
    module  == blog 
    controller == archive 
    action  == list 

Module + controller + action + params: 
http://example/blog/archive/list/sort/alpha/date/desc 
    module  == blog 
    controller == archive 
    action  == list 
    sort  == alpha 
    date  == desc 

下面的代碼片段似乎是我覺得這種行爲是證明其中最好的例子。

//excerpt from Zend_Controller_Router_Route_Module 

if ($this->_moduleValid || array_key_exists($this->_moduleKey, $data)) { 
      if ($params[$this->_moduleKey] != $this->_defaults[$this->_moduleKey]) { 
       $module = $params[$this->_moduleKey]; 
      } 
     } 
     unset($params[$this->_moduleKey]); 

     $controller = $params[$this->_controllerKey]; 
     unset($params[$this->_controllerKey]); 

     $action = $params[$this->_actionKey]; 
     unset($params[$this->_actionKey]); 

     foreach ($params as $key => $value) { 
      $key = ($encode) ? urlencode($key) : $key; 
      if (is_array($value)) { 
       foreach ($value as $arrayValue) { 
        $arrayValue = ($encode) ? urlencode($arrayValue) : $arrayValue; 
        $url .= self::URI_DELIMITER . $key; 
        $url .= self::URI_DELIMITER . $arrayValue; 
       } 
      } else { 
       if ($encode) $value = urlencode($value); 
       $url .= self::URI_DELIMITER . $key; 
       $url .= self::URI_DELIMITER . $value; 
      } 
     } 

     if (!empty($url) || $action !== $this->_defaults[$this->_actionKey]) { 
      if ($encode) $action = urlencode($action); 
      $url = self::URI_DELIMITER . $action . $url; 
     } 

     if (!empty($url) || $controller !== $this->_defaults[$this->_controllerKey]) { 
      if ($encode) $controller = urlencode($controller); 
      $url = self::URI_DELIMITER . $controller . $url; 
     } 

     if (isset($module)) { 
      if ($encode) $module = urlencode($module); 
      $url = self::URI_DELIMITER . $module . $url; 
     } 

     return ltrim($url, self::URI_DELIMITER); 
    } 

希望這會有所幫助。

+0

嗯,因爲我想在此情況下,404我申請在默認模塊「髒」的解決方案,指標控制器: '公共功能的indexAction(){ 如果 ($這個 - > Request()方法 - > getParam( 'module')!='default'){ throw new Zend_Controller_Action_Exception($ this-> translate(「找不到頁面」),404); } }' – rukavina 2012-03-24 17:27:52