4

有没有办法可以在 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');
    });
}
4

1 回答 1

1

它适用于 dispatch 而不是 dispatch.error 的原因是 dispatch 事件是从控制器内部触发的(参见 Zend\Mvc\Controller\AbstractController::dispatch)

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

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

为了自定义处理 dispatch.error 的方式,您可能需要为该事件编写自定义侦听器,甚至编写自己的 DispatchListener(尽管我不建议这样做)。然后,您也许可以查看 routeMatch 以确定您接下来要做什么。如果您使用的是 ModuleRouteListener,这可能非常简单。

于 2013-08-01T15:59:31.423 回答