2012-10-30 88 views
0

我試圖在一個模塊中設置一個事件,並在另一個模塊的控制器中觸發它。我使用的是共享的事件管理器,但它似乎即時做錯事..ZF2共享事件

模塊1:

public function onBoostrap(Event $e) 
     { 
       $sem = $e->getTarget()->getEventManager()->getSharedEventManager(); 
       $sem->attach('checkSomething', function(){ 
          die("checked"); 
       }); 
     } 

單詞數控制器:

public function checkAction() 
     { 
       $this->getEventManager()->trigger('checkSomething'); 
} 

。你們知道我可能是做錯了什麼?或者如果有更好的(正確)方法來做到這一點。

回答

0

您需要指定包含事件管理器實例的資源的標識符。許多類(Application,ModuleManager ...)使用它們的類名作爲其包含的EventManager實例中的標識符。然後

你的連接線應該是這樣的:

$sem->attach('Zend\Mvc\Application','checkSomething', function(){ 
         die("checked"); 
      }); 

(更新)從控制器,你應該調用應用程序eventmanager進行:

$this->getServiceLocator()->get('application')->getEventManager()->trigger('chec‌​kSomething'); 

歡呼聲,

亞辛

+0

仍然沒有工作..也許關於sharedmanager的東西? – MGP

3

Yassine解決方案中的問題在於該事件已獲得批准避免使用'Zend \ Mvc \ Application'。該事件標識符是不是在你的控制器提供

您可以通過執行以下代碼在行動

print_r($this->getEventManager()->getIdentifiers()); 

結果會像

Array ( 
    [0] => Zend\Stdlib\DispatchableInterface 
    [1] => Zend\Mvc\Controller\AbstractController 
    [2] => Application\Controller\TestController 
    [3] => Zend\Mvc\Controller\AbstractActionController 
    [4] => Application 
) 

我們解決您的問題進行驗證在你模塊中將事件添加到'應用'標識符 ,然後在動作中觸發你的事件。

這樣:

/*Module*/ 
public function onBootstrap($e) 
{ 
    $eventManager = $e->getApplication()->getEventManager(); 
    $sem   = $eventManager->getSharedManager(); 

    $sem->attach('Application', 'checkSomething', function() { 
     echo "checked"; 
     /* do more stuff here */ 
    }, 100); 

} 
/* a action in a controller */ 
$this->getEventManager()->trigger('checkSomething'); 

這將導致

checked 

所以您已成功觸發事件。