php-Symfonyカーネルイベントとカスタムイベント
応答後のコントローラーで、いくつかの作業を行う必要があります。使用するのに良いもの: 1.kernel.terminateイベントをリッスンします また 2.カスタムイベントをディスパッチします ?
kernel.terminateを使用する理由
ご覧のとおり、$ kernel->を呼び出して、送信後に終了します。 応答、できる場合はkernel.terminateイベントをトリガーします 戻るために遅れた可能性のある特定のアクションを実行する クライアントへの可能な限り迅速な応答(例:送信 メール)。
しかし、一方で、サブスクライバーのすべてのリクエストをチェックしても大丈夫ですか?
答え :
解決策:
kernel.terminate
は応答の送信後に発生し、クライアントが受信した後に実行できる「重い」操作に役立ちます。応答。ただし、いくつかの欠点があります。主に、問題が発生した場合、ユーザーに適切なフィードバックを提供する方法がありません(たとえば、再試行したり、問題を報告したりするため)。さらに、すべてのエラーがログに記録されるわけではありません( https://github.com/symfony/symfony/issues/19078 を参照)。
ジョブをGearmanキューに公開する場合は、 kernel.terminate
の使用を避けることをお勧めします。これは、通常、ジョブの公開には大量のリソースが含まれず、実行できるはずだからです。応答を送信する前に。したがって、カスタムイベントをトリガーしたり、コントローラーでより明示的な呼び出しを行うことでイベントディスパッチャーを完全に回避したりすることもできます。
答え :
解決策:
kernel.terminate
を使用しないと、応答後に独自のイベントを実行することはできません。これは、応答後に発生する可能性がある唯一のアクションであるためです。これは、フロントコントローラーの app.php
を見ると確認できます:
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
注意として、kernel.terminateはPHP-FPMを使用する場合にのみ機能します。それ以外の場合、メッセージキューを使用する以外の解決策はありません。
最後に、一般的なパターンは、 kernel.terminate
にリスナーを動的に追加することです。コントローラの内部から、 my_service
を呼び出す必要があると仮定します:
$ myService = $ this-> get('my_service');
$ this-> get('event_dispatcher')-> addListener('kernel.terminate'、function(Event $ event)use(myService){
$ myService-> doSomething();
});
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。