2016-06-22 6 views
3

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

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

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

ответ

5

что-то вроде этого следует сделать трюк:

$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 

} 
0

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

if ($this->enabled) {

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

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

my_doctrine_listener_enabled: true 

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

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

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

$container->getParameter('my_doctrine_listener_enabled') 

Or другой подход может быть:

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