1

使用 Zend 框架,我想在我的应用程序/模块上附加一个事件,以便在每个调度事件上,每个模块都会调用这个函数。这是我的代码:

类模块 { public function getConfig() { return include DIR。'/../config/module.config.php'; }

public function onBootstrap(MvcEvent $event)
{
    $application = $event->getApplication();
    $serviceManager = $application->getServiceManager();
    $sessionManager = $serviceManager->get(SessionManager::class);

    // Get event manager.
    $eventManager = $event->getApplication()->getEventManager();
    $sharedEventManager = $eventManager->getSharedManager();

    // Register the event listener method onDispatch
    $sharedEventManager->attach(AbstractActionController::class, 
            MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch'], 100);
}

public function onDispatch(MvcEvent $event)
{
    // Will perform application wide ACL control based on controller,
    // action and user data.
}

}

出于某种原因,我的 onDispatch 从未被调用,即使应用程序屏幕已加载。

不知道我错过了什么。据我所知,我需要使用共享事件管理器才能对整个应用程序有效。

帮助表示赞赏。

4

1 回答 1

3

为此(侦听 MVC 事件),您不需要共享事件管理器,而是需要 MVC 事件管理器。像这样更改您的代码,它将按预期工作:。

$application    = $event->getApplication();
$eventManager   = $application->getEventManager();

// Register the event listener method onDispatch
$eventManager->attach(MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch'], 100);

另请阅读这篇精彩的博客文章,了解有关何时使用共享事件管理器的更多详细信息。这篇博文也解释了这种特殊情况:

MVC事件的特例
我之前说过我们应该使用共享事件管理器。但是有一种特殊情况:我们从onBootstrap方法中检索到的事件管理器是 MVC 事件管理器。这意味着这个事件管理器知道框架触发的事件。这意味着如果你想为Zend\Mvc\MvcEvent类的事件添加监听器,你可以在不使用共享事件管理器的情况下做到这一点:

于 2016-12-14T09:47:58.690 回答