2012-03-24 4 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 на недействительной модуле. Например, по URL-адресу, например «/ en/mmm», запрос направляется по умолчанию/index/index. Однако для «/ en/mmm/ccc» запускается недействительный контроллер.

Спасибо!

ответ

0

рядом, как я могу сказать, это поведение нормальное.

Я смотрел документы и код, и кажется, что маршрутизатор загрузит контроллер/действие по умолчанию по URL-адресу, например /en/mmm. Язык: 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() { если ($ this-> GetRequest() -> GetParam ('module')! = 'default') { throw new Zend_Controller_Action_Exception ($ this-> translate («Страница не найдена»), 404); } } ' – rukavina

Смежные вопросы