カテゴリ: 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
Symfony
Symfonyのルーティング構成の基本を完全解説!初心者向けにYAML・PHP・アノテーション方式をやさしく紹介
New2
Laravel
Laravelのルートグループの使い方!初心者でもわかるprefixやミドルウェアの設定方法
New3
PHP
PHPのswitch文の使い方!多くの条件分岐をスッキリ書く方法と注意点
New4
Symfony
Symfony学習に役立つおすすめドキュメント・教材・リソース一覧【初心者向け】
人気記事
No.1
Java&Spring記事人気No1
PHP
PHPで文字列を結合する方法!ドット演算子と代入演算子の使い方を徹底解説
No.2
Java&Spring記事人気No2
PHP
PHPのif文の使い方を完全ガイド!初心者でもわかる条件分岐の基本
No.3
Java&Spring記事人気No3
Symfony
Symfonyで翻訳(i18n)機能を使う方法を解説!初心者にもわかる国際化対応の基本
No.4
Java&Spring記事人気No4
Laravel
Laravelのresponse()関数の使い方を完全ガイド!初心者でもわかるレスポンス制御とHTTPレスポンスの基本
No.5
Java&Spring記事人気No5
Laravel
LaravelのAPIルーティングを設定する方法!初心者でもわかるapi.phpの使い方
No.6
Java&Spring記事人気No6
CodeIgniter
CodeIgniterルーティングを完全攻略!正規表現でURLを自由自在に操る方法
No.7
Java&Spring記事人気No7
PHP
PHPのswitch文の使い方!多くの条件分岐をスッキリ書く方法と注意点
No.8
Java&Spring記事人気No8
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方