SymfonyのEventSubscriberとEventListenerの違いを初心者向けにやさしく解説
生徒
「Symfonyのイベントって聞いたことはあるんですが、EventListenerとEventSubscriberの違いがよく分かりません…」
先生
「どちらもイベントを受け取る仕組みですが、登録の仕方や考え方が少し違います。」
生徒
「名前が似ているので、混乱してしまいます。」
先生
「例え話を交えながら、順番に見ていきましょう。」
1. Symfonyのイベントシステムをおさらい
Symfonyにはイベントシステムという仕組みがあります。これは、プログラムの途中で「今から○○をしますよ」という合図を出し、それを受け取った別の処理が動く仕組みです。人の生活で例えると、チャイムが鳴ったら授業が始まる、というような流れに近いです。
Symfonyでは、画面表示やリクエスト処理の途中など、さまざまなタイミングでイベントが発生します。そのイベントを受け取り、追加の処理を行う役割を持つのがEventListenerやEventSubscriberです。
2. EventListenerとは何か
EventListenerは、特定のイベントが発生したときに実行される処理を定義する方法です。「このイベントが起きたら、このメソッドを実行する」と一つずつ登録していきます。
初心者の方には、「イベントと処理を一対一で結びつける方法」と考えると分かりやすいです。設定がシンプルで、動きも直感的です。
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\RequestEvent;
class SampleListener
{
public function onKernelRequest(RequestEvent $event)
{
// リクエスト時の処理
}
}
3. EventListenerの登録方法
EventListenerは、サービス設定で「どのイベントを監視するか」を指定します。Symfonyでは設定ファイルを使って登録するのが一般的です。
この方法は、「イベント名」と「実行するメソッド」がはっきり書かれているため、初心者でも流れを追いやすい特徴があります。
services:
App\EventListener\SampleListener:
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
4. EventSubscriberとは何か
EventSubscriberもイベントを受け取る仕組みですが、考え方が少し違います。クラスの中で「どのイベントを購読するか」をまとめて定義します。
購読とは「定期的に情報を受け取る」という意味です。新聞を購読すると毎日届くように、EventSubscriberは指定したイベントをまとめて受け取ります。
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
class SampleSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
'kernel.response' => 'onKernelResponse',
];
}
public function onKernelResponse(ResponseEvent $event)
{
// レスポンス時の処理
}
}
5. EventSubscriberの特徴
EventSubscriberの大きな特徴は、複数のイベントを一つのクラスで管理できる点です。関連する処理をまとめて書けるため、コードの整理がしやすくなります。
イベント名がクラス内にまとまっているので、「このクラスは何をしているのか」が一目で分かるのもメリットです。
6. EventListenerとEventSubscriberの違い
両者の違いを簡単にまとめると、登録方法と考え方の違いです。EventListenerは外部設定でイベントを指定し、EventSubscriberはクラス自身がイベントを宣言します。
一つのイベントだけを処理する場合はEventListener、複数のイベントをまとめて扱う場合はEventSubscriberが向いています。
7. 初心者はどちらから使うべきか
Symfonyを学び始めたばかりの方には、まずEventListenerがおすすめです。イベントと処理の関係が分かりやすく、理解しやすいからです。
慣れてきたら、関連するイベント処理をまとめる目的でEventSubscriberを使うと、コードが読みやすくなります。
8. イベントを使うメリット
イベントシステムを使う最大のメリットは、処理を分離できる点です。本来の処理に手を加えず、あとから機能を追加できます。
Symfonyではこの仕組みが多く使われており、EventListenerやEventSubscriberを理解することは、Symfony入門においてとても重要です。