我正在使用在配置文件中注册的几个学说侦听器进行一些自动更新(create_on,updated_on timestamps等)。目前,我已经实施了其他功能,该功能需要将准备好的值存储在数据库中以易于搜索。
我正在考虑更新SYMFONY命令,该命令将准备这些值而不是SQL Update脚本(实际上,以将值的方式的任何更改或更新更改都比仅运行此单个命令所需的方式)。但是,这也会触发前面提到的事件列表。
有办法如何禁用单个命令的特定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
}
在 services.yaml
中,我的侦听器以这种方式定义:
services:
AppEventListenerDoctrinePostUpdateListener:
tags:
- { name: doctrine.event_listener, event: postUpdate }
在我的听众类中,我添加了私有变量$enabled
,其条件以停止执行:
class DoctrinePostUpdateListener
{
private $enabled = true;
public function postUpdate(LifecycleEventArgs $args)
{
if ($this->enabled === false) { //stop execution
return;
}
.. your code to execute ..
return;
}
public function setEnabled(bool $enabled)
{
$this->enabled = $enabled;
}
}
,然后在我不想执行此侦听器的service/controller
代码中,我只是将此$enable
变量设置为false:
$listeners = $this->em->getEventManager()->getListeners('postUpdate');
foreach ($listeners as $key => $listener) {
if ($listener instanceof DoctrinePostUpdateListener) {
$listener->setEnabled(false);
break;
}
}
在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使用它,而是通过
来使用它$container->getParameter('my_doctrine_listener_enabled')
或另一种方法,可能是:
- 创建Doctrine侦听器中的变量"启用"
- 注入命令中的学说侦听器
- 设置
$this->myListener->enabled = false