我如何从骨架项目'应用程序'模块捕获事件回调中的错误


How can I use error handler from skeleton project 'Application' module to catch errors in event callbacks?

我试图在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
            );
    }
}