Zend Framework: как отключить маршрутизацию по умолчанию?

Я потратил много часов, пытаясь заставить это работать. И я в отчаянии. Было бы здорово, если бы кто-нибудь мог мне помочь :)

В настоящее время я использую Zend Framework 1.9.5, хотя я изо всех сил пытаюсь заставить это работать для многих версий.

Я хочу предоставить свои собственные маршруты через конфигурацию XML и убедиться, что все, что не определено в моей конфигурации, попадет в мой errorController. (желательно так, чтобы я мог их отдельно от EXCEPTION_NO_CONTROLLER и EXCEPTION_NO_ACTION)

Я подумал, что это означает, что мне нужно избавиться от маршрутов по умолчанию /: module /: controller /: action и /: controller /: action.

Поэтому, когда я говорю маршрутизатору удалитьDefaultRoutes (), он больше не будет соответствовать этим маршрутам по умолчанию. Но теперь маршрутизатор направляет каждый не маршрутизируемый маршрут к defaultcontroller :: defaultaction (Что за ??)

$front->getRouter()->removeDefaultRoutes();

Итак, кто-нибудь знает, как заставить фронтконтроллер (или его часть) генерировать исключение, когда URI не может быть маршрутизирован?

Причина, по которой я хочу это сделать, заключается в том, чтобы предотвратить дублирование контента и получить более качественные страницы 404 (в этом случае ошибки отсутствия контроллера / действий на самом деле являются ошибками приложения, а не ошибками)


person Maurice    schedule 25.11.2009    source источник


Ответы (2)


вы пробовали добавить новый маршрут, например

$route = new Zend_Controller_Router_Route('*', array('controller'=>'error', 'module'=>'default', 'action'=>'error'));


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

Вам нужно добавить этот маршрут первым, так как он должен обрабатываться последним.

person prodigitalson    schedule 01.12.2009
comment
Ладно, вот что я сделал. Это работает, потому что при этом действии я генерирую исключение, указывающее на ошибку 404. Это все еще обходной путь, но спасибо за помощника. - person Maurice; 29.12.2009

Перенесемся во времени на год спустя ... (музыка путешествия во времени)

Вот еще один способ, который, на мой взгляд, менее «навязчив». Вы можете написать плагин для перехвата маршрута по умолчанию, и когда это произойдет, просто сгенерируйте исключение, которое в конце всего цикла преобразуется в 404 фронт-контроллером.

class Application_Plugin_DisableDefaultRoutes extends Zend_Controller_Plugin_Abstract
{
    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
        $front = Zend_Controller_Front::getInstance();
        $currentRoute = $front->getRouter()->getCurrentRouteName();
        if ($currentRoute == 'default') {
            throw new Exception('Default route is disabled');
        }
    }
}

Вы можете загрузить свой плагин в Bootstrap.php

protected function _initPlugins()
{
    $front = Zend_Controller_Front::getInstance();
    $front->registerPlugin(new Application_Plugin_DisableDefaultRoutes());
}

Таким образом вы можете загрузить плагин в производственную машину и оставить его в разработке, где вы, возможно, захотите использовать маршрут по умолчанию для быстрых тестов или чего-то еще.

person Julian    schedule 24.07.2011
comment
Спасибо, я обнаружил, что система плагинов ZF1 довольно удобна и мощна. Еще не успел попробовать ZF2. - person Julian; 28.02.2012