Вопрос

Я использую Zend FW 1.9.2, хочу отключить маршруты по умолчанию и указать свои. Мне действительно не нравится маршрутизация по умолчанию /: controller /: action.

Идея состоит в том, чтобы внедрить маршруты в init, и когда запрос не может быть направлен на один из введенных маршрутов, он должен быть перенаправлен в контроллер ошибок. (используя регистр Zend_Controller_Plugin_ErrorHandler по умолчанию)

Это все работает нормально, до тех пор, пока я не отключу маршруты по умолчанию с помощью $ router- > removeDefaultRoutes (); Когда я это делаю, контроллер ошибок больше не направляет неотправленные запросы к контроллеру ошибок. Вместо этого он перенаправляет все непереведенные запросы в indexAction на контроллере по умолчанию.

Кто-нибудь знает, как отключить маршрутизацию по умолчанию /: controller /: action, но ПРОДОЛЖИТЬ обработку ошибок маршрута?

По сути, это то, что я делаю:

$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$router->removeDefaultRoutes(); // <-- when commented, errorhandling works as expected

$route = new Zend_Controller_Router_Route_Static(
    '',
    array('controller' => 'content', 'action' => 'home')
);
$router->addRoute('home', $route);
Это было полезно?

Решение

Проблема при удалении маршрутов по умолчанию заключается в том, что Zend больше не понимает действие urls /: module /: controller /:, поэтому при отправке маршрута он направляется в модуль по умолчанию, контроллер индекса, действие индекса.

Плагин Error работает с методом postDispath диспетчерской диспетчеризации и работает, потому что в стандартном маршрутизаторе, если контроллер, или модуль, или действие не найдены, он выдает ошибку.

Чтобы включить пользовательские маршруты в этой конфигурации, вы должны написать новый плагин, который работает в preDispatch, и проверить, если маршрут, а затем перенаправить на плагин ошибки в случае, если это недопустимый URL-адрес.

Другие советы

При удалении маршрутов по умолчанию вы удаляете маршрут по умолчанию, который использует плагин обработчика ошибок. Это означает, что когда он пытается направить на

array('module' => 'default, 'controller' => 'error', 'action' => 'index')

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

$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$router->removeDefaultRoutes(); // <-- when commented, errorhandling works as expected
// Re-add the error route 
$router->addRoute(
   'error', 
    new Zend_Controller_Router_Route (
       'error/:action',
       array (
          'controller' => 'error',
          'action' => 'error'
       )
    )
);

$route = new Zend_Controller_Router_Route_Static(
    '',
    array('controller' => 'content', 'action' => 'home')
);
$router->addRoute('home', $route);

Я столкнулся с той же проблемой для старого приложения, вот что решило мою проблему:

$front = Zend_Controller_Front::getInstance();
$router = $front->getRouter();
$route = new Zend_Controller_Router_Route('*', array('controller'=>'error', 'module'=>'error', 'action'=>'notfound'));
$router->addRoute('default', $route);
// After that add your routes.

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

И в ErrorController я определил:

public function notfoundAction()
{
    throw new Zend_Controller_Action_Exception('This page does not exist', 404);
}

Таким образом, любой маршрут, который не соответствует нашим маршрутам, будет использовать обработчик ошибок по умолчанию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top