У меня проблемы с удалением слушателя, который я создаю динамически:
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 не может удалить мой вызываемый из списка слушателей. Я отлаживал 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
возвращает ложь …
Я неправильно создаю свой обратный вызов?
Задача ещё не решена.
Других решений пока нет …