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

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

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

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

4

Решение

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

$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

}
7

Другие решения

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

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, а через

$container->getParameter('my_doctrine_listener_enabled')

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

  1. Создайте переменную «enabled» внутри слушателя Doctrine
  2. Внедрить слушателя Doctrine в команду
  3. Задавать $this->myListener->enabled = false
0

По вопросам рекламы [email protected]