Symfony Component Advent Calendar 2022の4日目の記事です。
最初に
SymfonyはPHPのフレームワークのひとつです。しかし、公式サイトの説明文には
Symfony is a set of PHP Components, a Web Application framework, a Philosophy, and a Community — all working together in harmony.
(SymfonyはPHPコンポーネントのセットで、Webアプリケーションフレームワークで、哲学、そしてコミュニティです。それらがハーモニーを奏でながら動作しています。)
と書かれている通り、PHPコンポーネントのセットで、たくさんのコンポーネントを提供しており、それらを組み合わせてひとつのフレームワークとして動作しています。Symfonyのコンポーネントは、Symfony上だけで動作するのではなく、他のPHPフレームワークやアプリケーションでも動作している強力なものが揃っています。
今回はそれらの中から、役立ちそうなもの・お薦めしたいものを紹介していきたいと思います。
※記事内ではautoloadのインポートは省略します。
リクエストからレスポンスまでのプロセスを制御する、"HttpKernel"
HttpKernelは、リクエストからレスポンスまでのプロセスを制御するコンポーネントです。
インストール
composer require symfony/http-kernel
主なフロー
SymfonyではHttpKernelを使って次のようなフローでリクエストを処理してレスポンスを返しています。
- リクエストを受け取り、リクエストオブジェクトを作る
-
kernel.requestイベント発火 - どのプログラムを実行するか決める
-
kernel.controllerイベント発火 - プログラムを実行し、レスポンスオブジェクトを作る
5.1.kernel.viewイベント発火 -
kernel.responseイベント発火 - レスポンスオブジェクトから、レスポンスを送る
- 終了する
-
kernel.terminateイベント発火
8.1.kernel.exceptionイベント発火
要所でイベントを発火し、該当箇所で必要な処理を実行するようになっています。
たとえば、kernel.requestでは、ルーティング設定を作成する処理が実行されます。
各イベントの目的
それぞれの箇所でのイベントの目的は次のようになっています。そろぞれの箇所で処理を追加したり、データを加工する必要がある場合は、該当のイベントをサブスクライブ・リッスンすることで可能となります。
| イベント | 目的 | クラス |
|---|---|---|
| kernel.request | リクエストオブジェクトに追加情報をつける | RequestEvent |
| kernel.controller | コントローラー実行前の初期処理 | ControllerEvent |
| kernel.view | もし、実行結果がレスポンスオブジェクトではない場合、結果からレスポンスオブジェクトを生成する | ViewEvent |
| kernel.response | 出力前にレスポンスオブジェクトを加工する | ResponseEvent |
| kernel.terminate | レスポンス出力後に必要な重い後処理を実行する | TerminateEvent |
| kernel.exception | 例外発生後の処理とレスポンスオブジェクトの作成 | ExceptionEvent |
まとめ
今回はHTTPのプロセス制御を行うHttpKernelの紹介でした。このHttpKernlと、ここまでに出てきたHttpFoundation, Routing, EventDispatcherを使い、SymfonyではHTTPのリクエストからレスポンスを返す仕組みを提供しています。