是否可以禁用Symfony 2事件侦听器,然后再重新启用它

是否可以禁用Symfony 2事件侦听器,然后再重新启用它,symfony,events,Symfony,Events,我需要在控制器中禁用Gedmo\timestable侦听器,然后在同一请求中重新启用它。下面是如何禁用它 但我找不到任何关于重新启用它的信息。是否可能?如果使用提供的相同解决方案,则会有一个相应的addEventListener()函数。您可能希望首先将所有事件侦听器保存到其他地方(可能在同一个类中)。大概是这样的: class MyClass { private $listeners; private function disableTimestampable() {

我需要在控制器中禁用Gedmo\timestable侦听器,然后在同一请求中重新启用它。下面是如何禁用它
但我找不到任何关于重新启用它的信息。是否可能?

如果使用提供的相同解决方案,则会有一个相应的
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
                    );
                }
            }
        }
    }
}
谢谢你的回答。我试图用同样的方法来拯救听众,但没有成功。我还发现我删除侦听器的方法是错误的。更简单和干净的解决方案是


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

谢谢您的回复。如果我们删除这些侦听器,它们是否可以通过$evm->getListeners()访问?公平地说,它们不会。你可能想把它们暂时保存在某个地方,比如在课堂上或其他地方。我修改了我的答案来反映这一点。只是好奇——我的答案最终对你有用吗?