Есть ли способ, которым я могу подключить прослушиватель событий для события dispatch.error
в Zend Framework 2, где этот прослушиватель будет присоединен только к EventManager, связанному с Module.php?
Я достиг этого, присоединив слушателя к dispatch
глобальному SharedManager и передав текущее пространство имен Module.php в качестве первого параметра. Он работает красиво, но не работает, когда я пытаюсь сделать то же самое для dispatch.error
.
Вот пример в Module.php:
public function init(ModuleManager $moduleManager) { $sharedManager = $moduleManager->getEventManager()->getSharedManager(); $sharedManager->attach(__NAMESPACE__, 'dispatch', function($e) { exit('IT WORKS'); }); $sharedManager->attach(__NAMESPACE__, 'dispatch.error', function($e) { exit('IT DOES NOT WORK'); }); }
Причина, по которой он работает для отправки, но не dispatch.error – это то, что событие отправки запускается изнутри в контроллере (см. Zend \ Mvc \ Controller \ AbstractController :: dispatch)
Поскольку вы расширяете этот класс своим собственным контроллером с расширением имен, можно связать событие с этим пространством имен.
Однако событие dispatch.error может запускаться до того, как контроллер (и вместе с ним – контекст вашего пространства имен) будет загружен. Это происходит в соответствии с более чем одним условием в Zend \ Mvc \ DispatchListener.
Чтобы настроить способ обработки dispatch.error, вам, скорее всего, потребуется написать пользовательский прослушиватель для этого события или даже написать собственный диспетчер отправки (хотя я бы рекомендовал это). Затем вы можете взглянуть на routeMatch, чтобы выяснить, что вы хотите сделать дальше. Если вы используете ModuleRouteListener, это может быть довольно легко.