ZF2:如何为dispatch.error附加特定于模块的侦听器


ZF2: How to attach module specific listener for dispatch.error

有没有一种方法可以为Zend Framework 2中的事件dispatch.error附加一个事件侦听器,其中该侦听器将只附加到与Module.php相关的EventManager?

我通过将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');
    });
}

它正在进行调度,但没有进行调度。错误是调度事件是从控制器内部触发的(请参阅Zend''Mvc''controller''AbstractController::dispatch)

因为您使用自己的命名空间控制器扩展了这个类,所以可以将事件与该命名空间相关联。

但是,dispatch.error事件可能会在加载控制器(以及命名空间的上下文)之前触发。这是根据Zend''Mvc''DispatchListener中的多个条件发生的。

为了自定义dispatch.error的处理方式,您可能需要为该事件编写一个自定义侦听器,甚至编写自己的DispatchListener(尽管我建议不要这样做)。然后,你可以查看routeMatch,了解下一步你想做什么。如果您正在使用ModuleRouteListener,这可能非常容易。