2016-12-05 60 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類的事件中,則可以在不使用共享事件管理器的情況下執行此操作: