Symfony 2: отключить прослушиватель событий доктрины в ContainerAwareCommand
Я использую несколько прослушивателей доктрины, зарегистрированных в конфигурационном файле для некоторых автоматических обновлений (created_on, updated_on метки времени и т. д.). В настоящее время я реализовал дополнительную функциональность, которая требует хранения подготовленных значений в базе данных для облегчения поиска.
Я думаю о команде update Symfony, которая подготовила бы эти значения вместо сценария обновления SQL (на самом деле любое изменение или обновление в том, как это значение создается, потребует просто запуска это единственная команда). Однако это также вызовет упомянутые выше EventListeners.
Есть ли способ отключить определенный список событий для одной команды?
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')
Или другой подход, может быть:
- создать переменную "enabled" внутри прослушивателя доктрины
- ввести слушателя доктрины в команду
- множество
$this->myListener->enabled = false