Zend Framework: удаление маршрутов по умолчанию
-
07-07-2019 - |
Вопрос
Я использую 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);
}
Таким образом, любой маршрут, который не соответствует нашим маршрутам, будет использовать обработчик ошибок по умолчанию.