2012-10-30 58 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 

所以您已成功触发事件。