Можно ли как-то обработать исключение, выданное слушателю EVENT_DISPATCH?
class Module
{
public function onBootstrap(EventInterface $event)
{
$application = $event->getTarget();
$eventManager = $application->getEventManager();
$eventManager->attach(MvcEvent::EVENT_DISPATCH, function(MvcEvent $event) {
throw new ForbiddenException("403 - Fobidden");
});
}
}
У меня есть общий способ обслуживания ForbiddenException
как установка 403, возвращение JSON и т. д. Вся логика привязана к MvcEvent::EVENT_DISPATCH_ERROR
слушатель. Как я могу перевести ForbiddenException
к слушателю внутри слушателя ошибки отправки? Бросив его из диспетчера отправки, выдается ошибка исключения Uncaught …
Любая помощь или советы, как это преодолеть, будут оценены!
Вы должны использовать менеджер sharedevent, чтобы связать событие. Как это :
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$sharedManager = $e->getApplication()->getEventManager()->getSharedManager();
$sm = $e->getApplication()->getServiceManager();
$sharedManager->attach(
'Zend\Mvc\Application',
'dispatch.error',
function($e) use ($sm) {
//Do what you want here
}
);
}
Я предлагаю заменить анонимную функцию вызываемым классом, когда она будет работать таким образом.
Если я вас правильно понимаю, вы хотите, чтобы слушатель был подключен к EVENT_DISPATCH_ERROR
событие для обработки исключения, которое вы поднимаете.
Для этого вместо просто throw
В случае исключения вы должны сами инициировать событие ошибки отправки с экземпляром вашего исключения как
один из его параметров, например …
class Module
{
public function onBootstrap(EventInterface $event)
{
$application = $event->getTarget();
$eventManager = $application->getEventManager();
$eventManager->attach(MvcEvent::EVENT_DISPATCH, function(MvcEvent $event) use ($eventManager) {
// set some identifier for your error listener to look for
$event->setError('forbidden');
// add an instance of your exception
$event->setParam('exception', new ForbiddenException("403 - Fobidden"));
// trigger the dispatch error with your event payload
$eventManager->trigger(MvcEvent::EVENT_DISPATCH_ERROR, $event);
});
}
}
после запуска ваш прослушиватель ошибок должен вступить во владение и обработать ваше исключение