2017-02-28 2 views
1

私のアプリケーションでは、私は "users"を持っています。 1人のユーザーが複数の「アカウント」を持つことができますEventListenerは他のエンティティと無限ループを更新します

「アカウント」エンティティにリスナーがあります。

私のサービスで
account_listener: 
    class: AppBundle\EventListener\AccountListener 
    arguments: 
     - '@service_container' 
    tags: 
     - {name: doctrine.event_listener, event: preUpdate} 

、方法更新前::それはこのような「service.yml」ファイルで宣言され

public function preUpdate(PreUpdateEventArgs $eventArgs) 
{ 
    $entity = $eventArgs->getEntity(); 
    if (!$entity instanceof Account) { 
     return; 
    } 

    $this->container->get('notification_manager')->sendNotification(); 
} 

sendNotificationをメソッドは、エンティティを作成しようとする関数を呼び出し「通知「

public function sendNotification() 
{ 
    $notification = new Notification(); 
    $data = array(
        'label' => 'Hello' 
       ) 
    $form_notif = $this->formFactory->create(NotificationType::class, $notification, ['method' => 'POST']); 
    $form_notif->submit($data,($method === 'POST')); 
    if ($form_notif->isValid()) 
    { 
     $this->em->persist($notification); 
     $this->em->flush(); 
    } else { 
     return $form_notif; 
    } 
    return $notification; 

} 

問題: 通知が作成され、PHPはSTですされていません無限ループでうまくいく。これを防止するために

、私はsendNotificationをメソッドのbegginingでこれを追加しました:これにより

$eventManager = $this->em->getEventManager(); 
$eventManager->removeEventListener(['preUpdate'],$this->container->get('account_listener')); 

を、それが動作します。しかし、私は良い方法があると思う。

私を助けることができますか?

おかげ

答えて

0

あなたがflushを呼び出すサービスを呼び出すと、私はremoveEventListener方法は無限ループを回避するための悪い方法ではないと思います。

実際にremoveEventListenerを呼びたくない場合は、パターンを変更し、doctrineイベントでflushを呼び出さないでください。

もう1つの方法は、フラッシュするオブジェクトのコレクション(1つのコレクションとゲッター/セッターがあるNotificationStackクラス)で3番目のサービスを使用することです。

sendNotificationメソッドは、このコレクションに要素を追加します(フラッシングなし)。

次に、kernel.responseイベント(および必要に応じてconsole.terminate)でコレクションをすべてフラッシュできます。

また、サービスのコンテナを注入することは悪いことです。必要なサービスやパラメータだけを注入する必要があります。

希望すると助かります

0

phpがスタックされた理由は次のとおりです。あなたはエンティティを挿入または更新するときに呼び出さpreUpdate()を呼び出す....

を今すぐあなたのsendNotificationをアクションが呼び出されます、あなたはその時間のEventListenerでNotification()を保存するときに、あなたのコードで

が呼ばれ、イベントリスナーからもう一度sendNotificationメソッドなどを呼び出すと、これは再帰的ループを作成します。そのため、ypur PHPがスタックされたのはこのためです。

ご希望の場合はお手数ですが、

関連する問題