加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何在多个类(和模块)上使用ZF2的EventManager?

发布时间:2020-12-13 17:16:24 所属栏目:PHP教程 来源:网络整理
导读:我有以下设置:在控制器中我触发一个事件,我想在其他地方附加多个监听器. 目前我的onBootstrap中有以下监听器: $e-getApplication()-getServiceManager()-get('EventManager')-attach('*',function($e) { var_dump($e-getName());}); 以下一段代码作为工厂
我有以下设置:在控制器中我触发一个事件,我想在其他地方附加多个监听器.

目前我的onBootstrap中有以下监听器:

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

以下一段代码作为工厂:

'ApplicationControllerFoo' => function(ControllerManager $cm) {
    $eventManager = $cm->getServiceLocator()->get('EventManager');
    $controller = new ApplicationControllerFooController();
    $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() { ... });

那么,我做错了什么?我只想触发事件并在可能不同的模块中捕获它们,但它似乎变得如此复杂……

解决方法

默认情况下,EventManager服务不是共享的,这意味着每次调用$serviceLocator-> get(‘EventManager’)都会得到一个不同的实例,这就是你应该使用SharedEventManager的原因 – 看看@Crisp的 link到看看如何使用它.

还有一个提示:不要尝试在对象中注入Mvc EventManager,每个对象都应该触发自己的事件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读