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