カテゴリ: Symfony 更新日: 2026/02/21

Symfonyのイベントとリスナー入門|Kernelイベントを初心者向けにやさしく解説

Symfonyで標準イベントをリスンする方法(Kernelイベントなど)
Symfonyで標準イベントをリスンする方法(Kernelイベントなど)

先生と生徒の会話形式で理解しよう

生徒

「Symfonyって聞いたことはあるんですが、イベントって何をするものなんですか?」

先生

「Symfonyでは、あるタイミングで自動的に発生する“出来事”をイベントとして扱います。その出来事を見張るのがリスナーです。」

生徒

「見張るってことは、何かが起きたら処理できるんですか?」

先生

「その通りです。今回はSymfonyで標準的に用意されているKernelイベントを例に、基本から見ていきましょう。」

1. Symfonyのイベントとは?

1. Symfonyのイベントとは?
1. Symfonyのイベントとは?

Symfonyのイベントとは、アプリケーションの中で「今、この処理が始まった」「この処理が終わった」という合図のようなものです。プログラム初心者の方は、学校のチャイムを想像するとわかりやすいです。チャイムが鳴ると、授業が始まったり終わったりしますよね。そのチャイムがSymfonyではイベントにあたります。

Symfonyではイベントを使うことで、特定の処理の前後に自分の処理を追加できます。これにより、元の処理を書き換えなくても機能を拡張できるのが大きな特徴です。

2. リスナーとは何をするもの?

2. リスナーとは何をするもの?
2. リスナーとは何をするもの?

リスナーは、イベントが発生したかどうかを待ち構えている存在です。電話が鳴るのを待っている人のようなイメージです。電話が鳴った瞬間に受話器を取りますが、それと同じで、イベントが発生した瞬間に処理が実行されます。

Symfonyでは、イベントとリスナーを組み合わせることで、処理の流れを細かく制御できます。難しそうに見えますが、「合図が出たら動く仕組み」と考えるとシンプルです。

3. Kernelイベントとは?

3. Kernelイベントとは?
3. Kernelイベントとは?

Kernelイベントは、Symfonyの中心部分であるKernelが発生させる標準イベントです。ページにアクセスしてから画面が表示されるまでの間に、いくつものKernelイベントが順番に発生しています。

代表的なものには、リクエストを受け取ったとき、コントローラが呼ばれる前、レスポンスを返す直前などがあります。これらを使うことで、ログの出力やアクセス制御などを簡単に追加できます。

4. Symfonyでイベントをリッスンする基本構造

4. Symfonyでイベントをリッスンする基本構造
4. Symfonyでイベントをリッスンする基本構造

Symfonyでイベントをリッスンするには、イベント専用のクラスを作成します。このクラスの中に、イベント発生時に実行したい処理を書きます。難しい言葉で言うと「イベントクラスにメソッドを登録する」ですが、実際はクラスを一つ作るだけです。


namespace App\EventListener;

use Symfony\Component\HttpKernel\Event\RequestEvent;

class SampleRequestListener
{
    public function onKernelRequest(RequestEvent $event)
    {
        // イベント発生時の処理
    }
}

この例では、リクエストを受け取った瞬間に呼ばれるKernelイベントを受け取っています。

5. services.yamlでリスナーを登録する方法

5. services.yamlでリスナーを登録する方法
5. services.yamlでリスナーを登録する方法

作成したリスナーは、そのままでは動きません。Symfonyに「このクラスはリスナーですよ」と教える必要があります。その設定を書く場所がservices.yamlです。


services:
    App\EventListener\SampleRequestListener:
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

ここでは「kernel.request」というイベントが発生したら、「onKernelRequest」というメソッドを呼ぶ、と設定しています。

6. 実際に処理を書いてみよう

6. 実際に処理を書いてみよう
6. 実際に処理を書いてみよう

次は、イベントが発生したことを確認できるように、簡単な処理を書いてみます。今回はアクセスがあったらメッセージを出す例です。


public function onKernelRequest(RequestEvent $event)
{
    if (!$event->isMainRequest()) {
        return;
    }

    error_log('リクエストがありました');
}

これでページにアクセスすると、裏側でログが出力されます。目に見えない処理ですが、確実に動いています。

7. レスポンス直前のKernelイベント

7. レスポンス直前のKernelイベント
7. レスポンス直前のKernelイベント

Symfonyではレスポンスを返す直前にもイベントが用意されています。画面に表示する内容を最後に少しだけ変更したい場合に便利です。


use Symfony\Component\HttpKernel\Event\ResponseEvent;

public function onKernelResponse(ResponseEvent $event)
{
    $response = $event->getResponse();
    $response->headers->set('X-Sample', 'Symfony');
}

このように、レスポンスにヘッダーを追加することも簡単にできます。

8. イベントとリスナーを使うメリット

8. イベントとリスナーを使うメリット
8. イベントとリスナーを使うメリット

イベントとリスナーを使う最大のメリットは、処理を分離できることです。一つのファイルに全部を書く必要がなくなり、後から見返しても理解しやすくなります。初心者の方でも、役割ごとに分ける意識が身につくので、結果的に読みやすいコードになります。

Symfonyのイベント仕組みは、最初は難しく感じますが、使い慣れると非常に便利な考え方です。

カテゴリの一覧へ
新着記事
New1
Laravel
LaravelでAPIのレスポンスをテストする方法を完全解説!assertJsonで初心者も安心
New2
CodeIgniter
CodeIgniterでRESTful API開発!初心者でもわかる全体構成ガイド
New3
Symfony
Symfonyのコントローラとは?作成・構造・役割を初心者向けにやさしく解説!
New4
Symfony
Symfonyでバリデーションメッセージを多言語対応する方法!初心者でもわかる国際化の基本
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのシングルアクションコントローラとは?使い方と利点
No.2
Java&Spring記事人気No2
Laravel
Laravelで動的パラメータをルートに渡す方法!初心者にもやさしいルートパラメータの使い方入門
No.3
Java&Spring記事人気No3
Symfony
Symfonyの依存性注入(DI)とは?コンストラクタでの注入方法を初心者向けに徹底解説
No.4
Java&Spring記事人気No4
Laravel
Laravelでキャッシュを使う方法(ファイル・Redis・Memcached)
No.5
Java&Spring記事人気No5
Laravel
LaravelのBlade構文まとめ!@if @foreach など基本ディレクティブ解説
No.6
Java&Spring記事人気No6
Laravel
Laravelのマイグレーション履歴を確認する方法を徹底解説!migrate:statusの使い方
No.7
Java&Spring記事人気No7
Laravel
Laravelで名前付きルートを設定する方法!初心者でもわかるroute()関数の使い方
No.8
Java&Spring記事人気No8
Laravel
Laravelでコントローラを作成する方法(artisanコマンド)