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のリクエストからレスポンスを返す仕組みを提供しています。