2016-12-05 61 views
1

使用Zend Framework时,我想在我的应用程序/模块上附加一个事件,以便在每个分解事件上调用此函数。这是我的代码:Zend Framework将自定义事件附加到共享事件管理器

类模块 { 公共职能getConfig(){ 回报 包括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不会被调用,即使应用程序的屏幕被加载。

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

帮助赞赏。

回答

1

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

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

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

阅读也this great blog post上使用时,共享事件管理器的更多细节。这种特殊的情况下也是在这个博客帖子解释道:

MVC事件
我前面,我们应该使用共享活动经理说的特殊情况。但有一个具体情况:我们从onBootstrap方法中检索的事件管理器是MVC事件管理器。这意味着这个事件管理器知道框架触发的事件。这意味着如果您想要将收听者添加到Zend\Mvc\MvcEvent类的事件中,则可以在不使用共享事件管理器的情况下执行此操作: