我正在尝试在一个模块中设置一个事件,并在另一个模块的控制器中触发它。我正在使用共享事件管理器,但似乎我做错了..
模块1:
public function onBoostrap(Event $e)
{
$sem = $e->getTarget()->getEventManager()->getSharedEventManager();
$sem->attach('checkSomething', function (){
die("checked");
});
}
Module2 controller:
public function checkAction ()
{
$this->getEventManager()->trigger('checkSomething');
}
你们知道我可能做错了什么吗?或者,如果有更好(正确)的方法来做到这一点..
答案 0 :(得分: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
所以你成功地触发了这个事件。
答案 1 :(得分:0)
您需要指定包含事件管理器实例的资源的标识符。许多类(Application,ModuleManager ...)在其包含的EventManager实例中使用其类名作为标识符。
您的附件行应如下所示:
$sem->attach('Zend\Mvc\Application','checkSomething', function (){
die("checked");
});
(更新)从控制器中,您应该调用应用程序EventManager:
$this->getServiceLocator()->get('application')->getEventManager()->trigger('checkSomething');
欢呼声,
亚辛