2017-08-10 10 views
3

コントローラのGedmo \ Timestampableリスナを無効にしてから、同じリクエスト内でリスナを有効にする必要があります。ここでそれを無効にする方法です。 https://github.com/Atlantic18/DoctrineExtensions/issues/1722 私はそれを有効にすることについて何かを見つけることができません。出来ますか?Symfony 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 
        ); 
       } 
      } 
     } 
    } 
} 
+0

ご返信ありがとうございます。これらのリスナーは$ evm-> getListeners()を使用してアクセスできますか? –

+0

フェアポイント、彼らはされません。クラスのように一時的にどこかに保存したいと思うでしょう。私はそれを反映するために私の答えを変更しました。 –

0

ありがとうございました。私はリスナーを節約して同等の解決策を試したが、うまくいかなかった。また、私はリスナーを削除すると間違った方向にいることがわかりました。よりシンプルでクリーンな解決策は、

フィールドのタイムスタンプ可能な機能を無効にし、Entityの永続化の直前にEntityのサービスクラス内の値を手動で更新することです。

関連する問題