Symfonyのイベントとリスナー入門|Kernelイベントを初心者向けにやさしく解説
生徒
「Symfonyって聞いたことはあるんですが、イベントって何をするものなんですか?」
先生
「Symfonyでは、あるタイミングで自動的に発生する“出来事”をイベントとして扱います。その出来事を見張るのがリスナーです。」
生徒
「見張るってことは、何かが起きたら処理できるんですか?」
先生
「その通りです。今回はSymfonyで標準的に用意されているKernelイベントを例に、基本から見ていきましょう。」
1. Symfonyのイベントとは?
Symfonyのイベントとは、アプリケーションの中で「今、この処理が始まった」「この処理が終わった」という合図のようなものです。プログラム初心者の方は、学校のチャイムを想像するとわかりやすいです。チャイムが鳴ると、授業が始まったり終わったりしますよね。そのチャイムがSymfonyではイベントにあたります。
Symfonyではイベントを使うことで、特定の処理の前後に自分の処理を追加できます。これにより、元の処理を書き換えなくても機能を拡張できるのが大きな特徴です。
2. リスナーとは何をするもの?
リスナーは、イベントが発生したかどうかを待ち構えている存在です。電話が鳴るのを待っている人のようなイメージです。電話が鳴った瞬間に受話器を取りますが、それと同じで、イベントが発生した瞬間に処理が実行されます。
Symfonyでは、イベントとリスナーを組み合わせることで、処理の流れを細かく制御できます。難しそうに見えますが、「合図が出たら動く仕組み」と考えるとシンプルです。
3. Kernelイベントとは?
Kernelイベントは、Symfonyの中心部分であるKernelが発生させる標準イベントです。ページにアクセスしてから画面が表示されるまでの間に、いくつものKernelイベントが順番に発生しています。
代表的なものには、リクエストを受け取ったとき、コントローラが呼ばれる前、レスポンスを返す直前などがあります。これらを使うことで、ログの出力やアクセス制御などを簡単に追加できます。
4. Symfonyでイベントをリッスンする基本構造
Symfonyでイベントをリッスンするには、イベント専用のクラスを作成します。このクラスの中に、イベント発生時に実行したい処理を書きます。難しい言葉で言うと「イベントクラスにメソッドを登録する」ですが、実際はクラスを一つ作るだけです。
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\RequestEvent;
class SampleRequestListener
{
public function onKernelRequest(RequestEvent $event)
{
// イベント発生時の処理
}
}
この例では、リクエストを受け取った瞬間に呼ばれるKernelイベントを受け取っています。
5. services.yamlでリスナーを登録する方法
作成したリスナーは、そのままでは動きません。Symfonyに「このクラスはリスナーですよ」と教える必要があります。その設定を書く場所がservices.yamlです。
services:
App\EventListener\SampleRequestListener:
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
ここでは「kernel.request」というイベントが発生したら、「onKernelRequest」というメソッドを呼ぶ、と設定しています。
6. 実際に処理を書いてみよう
次は、イベントが発生したことを確認できるように、簡単な処理を書いてみます。今回はアクセスがあったらメッセージを出す例です。
public function onKernelRequest(RequestEvent $event)
{
if (!$event->isMainRequest()) {
return;
}
error_log('リクエストがありました');
}
これでページにアクセスすると、裏側でログが出力されます。目に見えない処理ですが、確実に動いています。
7. レスポンス直前のKernelイベント
Symfonyではレスポンスを返す直前にもイベントが用意されています。画面に表示する内容を最後に少しだけ変更したい場合に便利です。
use Symfony\Component\HttpKernel\Event\ResponseEvent;
public function onKernelResponse(ResponseEvent $event)
{
$response = $event->getResponse();
$response->headers->set('X-Sample', 'Symfony');
}
このように、レスポンスにヘッダーを追加することも簡単にできます。
8. イベントとリスナーを使うメリット
イベントとリスナーを使う最大のメリットは、処理を分離できることです。一つのファイルに全部を書く必要がなくなり、後から見返しても理解しやすくなります。初心者の方でも、役割ごとに分ける意識が身につくので、結果的に読みやすいコードになります。
Symfonyのイベント仕組みは、最初は難しく感じますが、使い慣れると非常に便利な考え方です。