Symfony2 removeListener找不到我的监听器

时间:2017-05-25 16:46:03

标签: php symfony events

我在删除动态创建的侦听器时遇到问题:

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 ...

我是否错误地创建了回调?

0 个答案:

没有答案