Symfony 2: отключить прослушиватель событий доктрины в ContainerAwareCommand


Я использую несколько прослушивателей доктрины, зарегистрированных в конфигурационном файле для некоторых автоматических обновлений (created_on, updated_on метки времени и т. д.). В настоящее время я реализовал дополнительную функциональность, которая требует хранения подготовленных значений в базе данных для облегчения поиска.

Я думаю о команде update Symfony, которая подготовила бы эти значения вместо сценария обновления SQL (на самом деле любое изменение или обновление в том, как это значение создается, потребует просто запуска это единственная команда). Однако это также вызовет упомянутые выше EventListeners.

Есть ли способ отключить определенный список событий для одной команды?

2 4

2 ответа:

Что-то вроде этого должно сделать трюк:

$searchedListener = null;
$em = $this->getDoctrine()->getManager();
foreach ($em->getEventManager()->getListeners() as $event => $listeners) {
    foreach ($listeners as $key => $listener) {
        if ($listener instanceof ListenerClassYouLookFor) {
            $searchedListener = $listener;
            break 2;
        }
    }
}
if ($searchedListener) {
    $evm = $em->getEventManager();
    $evm->removeEventListener(array('onFlush'), $searchedListener);
}
else { //listener not found

}

Имеет больше смысла обернуть логику слушателя доктрины вокруг a:

if ($this->enabled) {

Таким образом, каждый может понять, что логика может быть отключена или нет.

Можно использовать параметр для включения или отключения кода (см. http://symfony.com/doc/current/service_container/parameters.html).

my_doctrine_listener_enabled: true

Вы устанавливаете его в false в вашей команде:

$container->setParameter('my_doctrine_listener_enabled', false);

Поскольку параметр изменяется во время выполнения, я рекомендую вам не использовать его через DIC, но via

$container->getParameter('my_doctrine_listener_enabled')

Или другой подход, может быть:

  1. создать переменную "enabled" внутри прослушивателя доктрины
  2. ввести слушателя доктрины в команду
  3. множество $this->myListener->enabled = false