是否可以禁用Symfony 2事件侦听器,然后再将其启用

时间:2017-08-10 13:25:46

标签: symfony events

我需要在控制器中禁用Gedmo \ Timestampable侦听器,然后在同一请求中启用它。以下是如何禁用它 https://github.com/Atlantic18/DoctrineExtensions/issues/1722 但我找不到任何关于启用它的信息。有可能吗?

2 个答案:

答案 0 :(得分:2)

如果您使用提供的相同解决方案,则会有相应的addEventListener()功能。您可能希望首先将所有事件侦听器保存在其他位置(可能在同一个类中)。像这样:

class MyClass
{
    private $listeners;

    private function disableTimestampable()
    {
        $evm = $this->em->getEventManager();

        $this->listeners = $evm->getListeners();

        foreach ($evm->getListeners() as $event => $listeners) {
            foreach ($listeners as $hash => $listener) {
                if ($listener instanceof \Gedmo\Timestampable\TimestampableListener) {
                    $evm->removeEventListener(
                        array('prePersist', 'loadClassMetadata', 'onFlush'),
                        $listener
                    );
                }
            }
        }
    }

    private function enableTimestampable()
    {
        $evm = $this->em->getEventManager();

        foreach ($this->listeners as $event => $listeners) {
            foreach ($listeners as $hash => $listener) {
                if ($listener instanceof \Gedmo\Timestampable\TimestampableListener) {
                    $evm->addEventListener(
                        array('prePersist', 'loadClassMetadata', 'onFlush'),
                        $listener
                    );
                }
            }
        }
    }
}

答案 1 :(得分:0)

感谢您的回答。我尝试了与拯救听众的平等解决方案,但它没有奏效。我还发现我在移除听众方面做错了。

更简单,更干净的解决方案

为我的字段禁用时间戳功能,并在实体持久化之前直接在实体的服务类中手动更新该值。

相关问题