ZF3 / 2 — как отловить исключение, выданное слушателем EVENT_DISPATCH?

Можно ли как-то обработать исключение, выданное слушателю 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 …

Любая помощь или советы, как это преодолеть, будут оценены!

3

Решение

Вы должны использовать менеджер 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
}
);
}

Я предлагаю заменить анонимную функцию вызываемым классом, когда она будет работать таким образом.

2

Другие решения

Если я вас правильно понимаю, вы хотите, чтобы слушатель был подключен к 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);
});
}
}

после запуска ваш прослушиватель ошибок должен вступить во владение и обработать ваше исключение

2

По вопросам рекламы [email protected]