Недопустимый модуль масок маршрута Zend по умолчанию

В application.ini у меня есть маршрут по умолчанию:

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» запрос направляется на default / index / index. Однако для "/ en / mmm / ccc" срабатывает недопустимый контроллер.

Спасибо!


person rukavina    schedule 24.03.2012    source источник


Ответы (1)


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

Я просматривал документы и код, и кажется, что маршрутизатор загрузит контроллер / действие по умолчанию по URL-адресу, например /en/mmm. Lang: en допустим, но mmm не соответствует допустимому модулю или контроллеру, поэтому используется маршрут по умолчанию.

В случае en/mmm/ccc он выдает ошибку 404, потому что в отсутствие действующего модуля маршрут будет соответствовать контроллеру / действию, и поскольку значения недействительны, приведет к 404. Я уверен, почему это приводит к 404 а неверный контроллер просто приводит к вызову маршрута по умолчанию.

Эта активность в определенной степени продемонстрирована в этих примерах из Маршруты по умолчанию:

 // 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);
    }

Надеюсь это поможет.

person RockyFord    schedule 24.03.2012
comment
Хм, поскольку я хочу, чтобы в этой ситуации было 404, я применил грязное решение в модуле по умолчанию, в контроллере индекса: public function indexAction() { if($this->getRequest()->getParam('module') != 'default'){ throw new Zend_Controller_Action_Exception($this->translate("Page not found"),404); } } - person rukavina; 24.03.2012