2016-07-08 5 views
-2

私のコントローラでは、応答後、私はいくつかの作業を行う必要があります。より良いもの: 1. kernel.terminateイベントを聞きます または 2.カスタムイベント をディスパッチしますか?symfonyカーネルのイベントとカスタムイベント

なぜkernel.terminateですか?

あなたは$ kernel-を呼び出すことで、見ることができるように> 応答を送信した後に終了し、あなたは あなたが 返すために遅れている可能性のある特定のアクションを実行することができkernel.terminateイベントをトリガします(例えば、 電子メールを送信する)クライアントにできるだけ早く応答することができます。

しかし、一方で、私の加入者のすべての要求をチェックするのは大丈夫ですか?

+1

実際に何をしているかによって異なります。 – Gerry

+0

Gerry、私はGearmanキューにメッセージを送信する必要があります。 –

+0

私は理想的には、kernel.terminateイベントでsubscribeを使用していますが、すべてのリクエストに耳を傾けるのは躊躇していますか? –

答えて

2

kernel.terminateが発生し、クライアントが応答を受信した後に実行できるいくつかの「重い」操作のために役立つことができます:あなたのコントローラ内から、あなたがmy_serviceを呼び出す必要がありますと仮定。しかし、何か問題が生じた場合、ユーザーに適切なフィードバックを与える方法はありません(たとえば、再試行や問題の報告など)。さらに、すべてのエラーが記録されるわけではありません(https://github.com/symfony/symfony/issues/19078参照)。

Gearmanキューにジョブを公開したいので、通常はジョブを公開するには重要なリソースが含まれていないため、応答を送信する前に実行する必要があるため、kernel.terminateを使用しないでください。したがって、あなたのカスタムイベントをトリガすることができますし、コントローラでより明示的な呼び出しを行うことで、イベントディスパッチャを完全に回避することもできます。

2

kernel.terminateを使用せずに応答後に仕事をすることはできません。これは応答の後にが発生する唯一のアクションであるためです。私たちは、フロントコントローラapp.phpを見たことで、これを確認することができます。注意点としては

$request = Request::createFromGlobals(); 
$response = $kernel->handle($request); 
$response->send(); 
$kernel->terminate($request, $response); 

を、kernel.terminateはonly if you use PHP-FPMに動作します。それ以外の場合は、メッセージキューを使用している以外の解決策はありません。

最後に、共通パターンは、kernel.terminateにリスナーを動的に追加することです。応答が送られた後

$myService = $this->get('my_service'); 

$this->get('event_dispatcher')->addListener('kernel.terminate', function (Event $event) use (myService) { 
    $myService->doSomething(); 
}); 
+0

私はそれを見ます。ディスパッチイベントはいつでも問題ありません。dbに保存した後に実行できます。しかし、kernel.terminateスクリプトを使用すると、イベント処理が完了するまで待たされることはありません。一方、私はすでに言ったように、すべての要求に耳を傾けて良いと言います。 –

+0

あなたは何らかの同期イベントを望みますか?その後、kernel.responseの代わりに使うことができます。 – romaricdrigon

+0

技術的には、カスタムイベントをkernel.terminateリスナ内でトリガすることができます。 – Gerry

関連する問題