SymfonyのExceptionListenerで例外処理とデバッグをやさしく解説!初心者向け完全ガイド
生徒
「Symfonyって、エラーが出たときに赤い画面が出ますよね。あれはどうやって処理しているんですか?」
先生
「Symfonyでは、例外という仕組みを使ってエラーを管理しています。その中心にあるのがExceptionListenerです。」
生徒
「ExceptionListenerって難しそうな名前ですが、初心者でも使えるんですか?」
先生
「仕組みを一つずつ知れば大丈夫です。パソコンを触ったことがなくても分かるように説明しますよ。」
1. Symfonyと例外処理とは何か?
Symfony(シンフォニー)は、PHPで作られたWebアプリケーションフレームワークです。フレームワークとは、アプリを作るための便利な道具箱のようなものです。
その中で例外処理とは、プログラムがうまく動かなかったときに起こる「エラー」を安全に受け止める仕組みです。例えるなら、料理中に包丁を落としそうになったときに、ケガをしないように受け止めるマットのような存在です。
Symfonyでは、この例外処理を自動で行ってくれますが、さらに細かく制御するためにExceptionListenerを使います。
2. ExceptionListenerとは?
ExceptionListenerは、Symfonyでエラー(例外)が発生した瞬間に動く監視役です。
たとえば、電車の運行管理システムのように、トラブルが起きたらすぐに検知して「画面に何を表示するか」「ログを残すか」を判断します。
SymfonyのExceptionListenerを使うことで、エラー画面を自分好みに変更したり、デバッグしやすくすることができます。
3. 例外(Exception)の基本を知ろう
例外とは、プログラムの実行中に起こる予期しない出来事です。たとえば「存在しないページにアクセスした」「数字を入れる場所に文字を入れた」などです。
PHPでは、throwを使って例外を投げます。
throw new Exception('エラーが発生しました');
この1行は、「ここで問題が起きましたよ」とSymfonyに知らせている状態です。Symfonyはこれを受け取り、ExceptionListenerに伝えます。
4. SymfonyでExceptionListenerが動く流れ
Symfonyでは、リクエスト(アクセス)→処理→レスポンス(表示)という流れがあります。
この途中でエラーが起きると、Symfonyはイベントという合図を出します。ExceptionListenerはそのイベントを聞いています。
流れを簡単に書くと次のようになります。
ページにアクセス
↓
処理中にエラー発生
↓
ExceptionListenerが検知
↓
エラー画面を表示
5. ExceptionListenerの基本的な作り方
ExceptionListenerは、PHPのクラスとして作成します。まずはとてもシンプルな例を見てみましょう。
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
class ExceptionListener
{
public function onKernelException(ExceptionEvent $event)
{
$exception = $event->getThrowable();
}
}
ここで使われているクラスとは、処理をまとめた箱のようなものです。onKernelExceptionは「エラーが起きたら呼ばれる関数」です。
6. services.yamlでExceptionListenerを登録する
Symfonyでは、作ったExceptionListenerを「使いますよ」と登録する必要があります。その設定を書く場所がservices.yamlです。
services:
App\EventListener\ExceptionListener:
tags:
- { name: kernel.event_listener, event: kernel.exception }
この設定は、「エラーが起きたら、このExceptionListenerを呼んでください」という意味です。初心者の方は「登録作業」と覚えておけば大丈夫です。
7. エラー内容を画面に表示してみよう
次は、実際にエラー内容を画面に表示する例です。デバッグとは、エラーの原因を探す作業のことです。
use Symfony\Component\HttpFoundation\Response;
public function onKernelException(ExceptionEvent $event)
{
$exception = $event->getThrowable();
$response = new Response(
'エラー内容:' . $exception->getMessage()
);
$event->setResponse($response);
}
これで、エラーが起きたときに「エラー内容:〇〇」と表示されます。原因が分かるだけで、修正がとても楽になります。
8. デバッグと本番環境の考え方
Symfonyでは、開発中(デバッグ)と実際に公開する本番環境で、エラーの見せ方を変えます。
開発中は詳しいエラーを表示し、本番では「問題が発生しました」とだけ表示します。これは、家の中では説明書を広げて、外では必要最低限だけ持つイメージです。
ExceptionListenerを使えば、この切り替えも自由に制御できます。