Symfony 2: Disable Doctrine event listener in ContainerAwareCommand

情到浓时终转凉″ 提交于 2019-12-05 22:17:01

问题


I am using several Doctrine listeners registered in configuration file for some automatic updates (created_on, updated_on timestamps etc.). Currently I have implemented additional functionality that requires stashing prepared values in the database for easier searching.

I am thinking about update Symfony command that would prepare these values instead of SQL update script (actually any sort of change or update in the way the value is crated would than require just running this single command). However this would also trigger the EventListeners mentioned earlier.

Is there a way how to disable particular EventLister for single Command?


回答1:


something like this should do the trick :

$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

}



回答2:


It make more sense to wrap the logic inside Doctrine listener around a:

if ($this->enabled) {

So everyone can understand that the logic can be disabled or not.

You could use a parameter to enable or not the code (see http://symfony.com/doc/current/service_container/parameters.html).

my_doctrine_listener_enabled: true

You set it to false in your command:

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

Since the parameter is modified at runtime, I recommend you to not use it via DIC but via

$container->getParameter('my_doctrine_listener_enabled')

Or another approach, could be:

  1. Create variable "enabled" inside Doctrine listener
  2. Inject Doctrine listener in command
  3. Set $this->myListener->enabled = false


来源:https://stackoverflow.com/questions/37961016/symfony-2-disable-doctrine-event-listener-in-containerawarecommand

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!