我试图在ZF2事件管理器中附加回调到'调度'事件,以便对每个请求进行自动身份验证。
// Auth/Module.php
class Module
{
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach(
MvcEvent::EVENT_DISPATCH,
array($this, 'authCallback')
);
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
}
public function authCallback(MvcEvent $event)
{
// SNIP
if (! $authenticated) {
throw new UnauthorizedException('Yada yada');
}
}
如果身份验证失败,我会抛出一个异常,我想使用内置于skeleton-project Application模块中的错误处理来处理这个异常。我遇到的问题是,它似乎正在处理控制器中抛出的错误,但不会处理回调('dispatch'事件钩子)中auth服务抛出的异常
我尝试将回调附加到不同的事件,如"完成"或"渲染",我尝试在附加事件时改变优先级,但没有任何效果。如何使用现有的错误处理程序捕获此异常?
我还尝试在回调事件中设置一个错误,如下所示
public function authCallback(MvcEvent $event)
{
$auth = 'Zend_Auth::getInstance();
// SNIP
if (! $authenticated) {
$event->setError('somethings wrong');
}
}
但是当我这样做的时候,没有错误处理,原始的请求仍然通过
我最终不得不在事件上设置错误和异常,然后触发EVENT_DISPATCH_ERROR,而不是仅仅抛出异常。
public function authCallback(MvcEvent $event)
{
$auth = 'Zend_Auth::getInstance();
// SNIP
if (! $authenticated) {
$event->setError('Something happened')
->setParam(
'exception',
new UnauthorizedException('blah blah')
);
$event->getApplication()
->getEventManager()
->trigger(
MvcEvent::EVENT_DISPATCH_ERROR,
$this,
$event
);
}
}