我在删除动态创建的侦听器时遇到问题:
public function renderMyData($dataA, $dataB)
{
$key = $dataA->getKey();
$this->callables[$key] = function ($event) use ($dataA, $dataB) {
$this->onTableRendered($dataA, $dataB, $event->getAProperty());)
};
$this->eventDispatcher->addListener(
Events::TABLE_RENDERED,
$this->callables[$key]
);
}
我这样做主要是因为我想在Events::TABLE_RENDERED
上投放自己的事件,并在其上添加$dataA
和$dataB
。
因为可以使用renderMyData
和$dataA
的不同值调用此$dataB
,所以我希望只为每个数据块调用一次侦听器,所以我要做的第一件事就是onTableRendered
将取消注册我创建的可调用对象。
public function onTableRendered($dataA, $dataB, $aProperty)
{
$key = $dataA->getKey();
$this->eventDispatcher->removeListener(
Events::TABLE_RENDERED,
$this->callables[$key]
);
// Create new event
$this->eventDispatcher->dispatch(
new MyNewEvent($dataA, $dataB, $aProperty)
);
}
然而,Symfony无法从其侦听器列表中删除我的callable。我调试了symfony(使用v2.6.11),直到达到\Symfony\Component\EventDispatcher\EventDispatcher
foreach ($this->listeners[$eventName] as $priority => $listeners) {
if (false !== ($key = array_search($listener, $listeners, true))) {
unset($this->listeners[$eventName][$priority][$key], $this->sorted[$eventName]);
}
}
我可以看到我的回调位于$listeners
内,但array_search
返回false ...
我是否错误地创建了回调?