Events ZF2从事件管理器中删除匿名函数

Events ZF2从事件管理器中删除匿名函数,events,zend-framework2,Events,Zend Framework2,在我的模块的onBootstrap函数中,我附加了一个连接到dispatch.error事件的匿名函数(用于日志记录): 我现在正在设置单元测试,不希望日志功能在测试请求上运行 如何从事件管理器中删除此匿名函数 从: 贴上 [剪报] 该方法返回Zend\Stdlib\CallbackHandler的实例;这 如果需要,可以稍后将值传递给detach() 及 拆卸 [剪报] 扫描所有侦听器,并分离与$listener匹配的任何侦听器,以便不再触发它们 因此,我已将我的附件更改为: $logCall

在我的模块的
onBootstrap
函数中,我附加了一个连接到
dispatch.error
事件的匿名函数(用于日志记录):

我现在正在设置单元测试,不希望日志功能在测试请求上运行

如何从事件管理器中删除此匿名函数

从:

贴上 [剪报]

该方法返回Zend\Stdlib\CallbackHandler的实例;这 如果需要,可以稍后将值传递给detach()

拆卸 [剪报]

扫描所有侦听器,并分离与$listener匹配的任何侦听器,以便不再触发它们

因此,我已将我的
附件更改为:

$logCallBack = $eventManager->attach('...
我应该将回调保存到什么位置,以便在单元测试中删除它

$this->getApplication()->getEventManager()->detach(???);

分配返回的处理程序,然后使用它将其分离

$callBackHandler = $eventManager->attach('dispatch.error', function($e) {
    //Code here
});

$eventManager->detach($callBackHandler);`

我已将以下内容添加到
$\u服务器的回调中
全局变量:

$logCallBack = $eventManager->attach(['dispatch.error', 'render.error'], function($e) {
    //...
}
$_SERVER['logCallBack'] = $logCallBack;
然后我想在哪里注销它们:

$callBacks = $_SERVER['logCallBack'];
if(!is_array($callBacks)) {
    $callBacks = [$callBacks];
}
foreach($callBacks as $callback) {
    $this->getApplication()->getEventManager()->detach($callback);
}

作为权宜之计,我得到了
$\u服务器['logCallBack']=$logCallBack
$this->getApplication()->getEventManager()->分离($\u服务器['logCallBack']),但这感觉很粗糙。有没有一种方法可以使用sharedmanager或其他什么东西来实现这一点?在执行单元测试时,不应该引导所有模块。我很久以前就写过这个答案,最干净的解决方案是将匿名函数重构为可调用函数(一个简单的旧php类,带有
\u invoke()
方法就足够了)并将其添加到服务管理器->是的,我已经完成了。事件管理器正在模块引导文件中附加函数,我想在测试控制器中分离它。我如何从引导程序中存储回调处理程序,以便在我的应用程序中的其他位置检索它?@Richard,明白你的意思了,我已经通过在配置文件(在配置文件夹下)中添加参数解决了这类问题,如testing=true,此配置数据在整个应用程序中都是可用的,并且基于您可以附加事件的真或假条件,一个简单的选项可以是使用
$mvcEvent->setParam('callbackHandler',$callbackHandler')添加对Mvc事件的引用
然后使用
$this-getMvcEvent()->getParam('callbackHandler')在控制器内获取它。否则,将事件的附加移动到控制器工厂,并仅在需要时附加。
$callBacks = $_SERVER['logCallBack'];
if(!is_array($callBacks)) {
    $callBacks = [$callBacks];
}
foreach($callBacks as $callback) {
    $this->getApplication()->getEventManager()->detach($callback);
}