2013-05-01 69 views
4

我有以下設置:在控制器中,我觸發一個事件,並且我想在其他地方附加多個偵聽器。如何在多個類(和模塊)上使用ZF2的EventManager?

目前,我有以下的聽衆在我onBootstrap

$e->getApplication()->getServiceManager()->get('EventManager')->attach('*', function($e) { 
    var_dump($e->getName()); 
}); 

下面的代碼爲工廠

'Application\Controller\Foo' => function(ControllerManager $cm) { 
    $eventManager = $cm->getServiceLocator()->get('EventManager'); 
    $controller = new \Application\Controller\FooController(); 
    $controller->setEventManager($eventManager); 
    return $controller; 
}, 

最後下列觸發我控制器內

$this->getEventManager()->trigger('foo-finished', 'finishedAction', array(
    'obj' => $foo->someObject() 
)); 

所以都應該是一樣的EventManager,我從服務定位器接收它,並將其注入到控制器。仍然沒有輸出。附加事件時,我也嘗試使用$e->getApplication()->getEventManager(),但這隻給了我ZF內部事件。

我看了一下SharedEventManager,但我不完全理解爲什麼我要傳遞的上下文。我嘗試這樣(這是我理解它),但仍然沒有輸出。

$e->getApplication()->getServiceManager()->get('EventManager') 
    ->getSharedManager() 
    ->attach('finishedAction', '*', function() { ... }); 

那麼,我做錯了什麼?我只是想以觸發事件,並抓住他們可能在不同的模塊,但它似乎是做出這麼複雜......

+1

這裏看到答案爲例 - > http://stackoverflow.com/questions/15227693/zf2-shared-modules-event-manager/15243247#15243247 – Crisp 2013-05-01 14:04:58

回答

4

默認情況下,EventManager服務不共享,這意味着每次調用時$serviceLocator->get('EventManager')你會得到一個不同的實例,這就是爲什麼你應該使用SharedEventManager - 看看@ Crisp的link看看如何使用它。

一個提示:不要試圖在你的對象注入了MVC eventmanager進行,每個對象應觸發自己的事件。

0

下工作對我來說(getEventManager和getSharedManager的不是順序),也注意到事件名稱的順序和上下文(或標識)。

$e->getApplication()->getEventManager()->getSharedManager()->attach('*', 'finishedAction', function() { ... }); 

問候!