Symfonyで404や403のエラーページをカスタマイズする方法!初心者でもわかるルーティングのエラー処理
生徒
「Symfonyで、ページが見つからないときやアクセスできないときに、もっとわかりやすい画面にしたいんですけど、できますか?」
先生
「はい、Symfonyでは、404(ページが見つからない)や403(アクセス禁止)といったエラー画面を自由にカスタマイズすることができますよ。」
生徒
「エラーって英語の画面が出てくるので、見た人がびっくりしちゃいそうで…」
先生
「そのとおりですね。それでは、エラーページを自分で作る方法を一緒に見ていきましょう!」
1. 404エラーと403エラーとは?
404エラーは、「そのページは存在しません」という意味のエラーです。URLを間違えたときや、存在しないルートにアクセスしたときに出ます。
403エラーは、「そのページにはアクセスできません」という意味です。ログインしていないと見られないページなどにアクセスしたときに表示されます。
どちらも、Symfonyのルーティングに関連する重要なエラーです。
2. Symfonyではどうやってエラーを表示しているの?
Symfonyでは、エラーが起きたときにtemplates/bundles/TwigBundle/Exceptionという特別な場所にあるテンプレートを使ってエラーページを表示します。
このフォルダの中にファイルを作っておけば、Symfonyは自動的にそれを使ってエラー画面を出してくれます。
3. 404エラーページのカスタマイズ方法
まずは、「ページが見つかりません」という404エラー画面を作ってみましょう。次のようにテンプレートファイルを作成します。
{# templates/bundles/TwigBundle/Exception/error404.html.twig #}
<!DOCTYPE html>
<html>
<head>
<title>ページが見つかりません</title>
</head>
<body>
<h1>404 - お探しのページは見つかりませんでした</h1>
<p>URLをもう一度ご確認ください。</p>
<a href="/">トップページに戻る</a>
</body>
</html>
このファイルを作ることで、404エラーが発生したときにオリジナルの日本語ページが表示されるようになります。
4. 403エラーページのカスタマイズ方法
次に、403(アクセス禁止)のエラーページも作っておきましょう。以下のようにファイルを作ります。
{# templates/bundles/TwigBundle/Exception/error403.html.twig #}
<!DOCTYPE html>
<html>
<head>
<title>アクセスできません</title>
</head>
<body>
<h1>403 - このページにはアクセスできません</h1>
<p>必要な権限がないか、ログインしていない可能性があります。</p>
<a href="/login">ログインページへ</a>
</body>
</html>
これで、アクセス制限がかかっているページにアクセスしたときに、ユーザーにやさしい説明を出せるようになります。
5. すべてのエラーに共通のページを出す方法
404や403だけでなく、すべてのエラーに対して共通のカスタムエラーページを出したい場合は、次のようなファイルを作成します。
{# templates/bundles/TwigBundle/Exception/error.html.twig #}
<!DOCTYPE html>
<html>
<head>
<title>エラーが発生しました</title>
</head>
<body>
<h1>エラーコード: {{ status_code }}</h1>
<p>申し訳ありません。問題が発生しました。</p>
<a href="/">トップページに戻る</a>
</body>
</html>
{{ status_code }}は、表示されるエラー番号(例:404や403)を動的に出してくれる変数です。
6. Twigとは?テンプレートエンジンのしくみ
これまでの例に出てきた.twigという拡張子のファイルは、Twig(トゥイッグ)というテンプレートエンジンで書かれたものです。HTMLの中に{{ }}のような変数を入れて、動的に内容を変えることができます。
たとえば、{{ status_code }}と書けば、現在のエラー番号が表示される仕組みです。
7. テンプレートの配置場所に注意しよう
Symfonyでエラー画面をカスタマイズするには、templates/bundles/TwigBundle/Exception という場所にファイルを置く必要があります。スペルミスやフォルダの位置を間違えると、カスタム画面が反映されません。
もし、正しく動作しないときは、キャッシュをクリアしてみましょう。
php bin/console cache:clear
これでSymfonyが新しいテンプレートを読み込んでくれるようになります。
8. かわいいエラー画面や案内リンクをつけてみよう
エラー画面はただの警告だけでなく、見る人が安心できるようなデザインにすることも大切です。イラストを表示したり、トップページやサポートへのリンクをつけたりすると、ユーザーにとってやさしいWebサイトになります。
たとえば、「こちらからトップページへ戻れます」といったリンクをつけるだけでも印象が変わります。
まとめ
Symfonyのエラーページカスタマイズを振り返ろう
この記事では、Symfonyで発生する代表的なエラーである404エラーや403エラーを中心に、エラーページをカスタマイズする方法を学んできました。WebサイトやWebアプリケーションを運営していると、存在しないページにアクセスされたり、権限のないページを開こうとされたりする場面は必ず発生します。そのときに、無機質な英語のエラー画面が表示されると、利用者は不安になってしまいます。
Symfonyでは、テンプレートを正しい場所に配置するだけで、エラー画面を自由にカスタマイズできます。特に templates/bundles/TwigBundle/Exception というディレクトリは、エラー処理において重要な役割を持っています。この場所に error404.html.twig や error403.html.twig を用意することで、エラーの種類ごとに分かりやすい説明を表示できるようになります。
404と403を分けて考えることの大切さ
404エラーは「ページが存在しない」ことを伝えるエラーであり、URLの間違いやリンク切れが原因になることが多いです。一方、403エラーは「アクセス権限がない」ことを示すエラーで、ログイン状態やユーザー権限と深く関係しています。この2つを正しく使い分け、それぞれに合ったメッセージを表示することで、ユーザーは次に何をすればよいのか理解しやすくなります。
例えば、404エラーではトップページへのリンクを案内し、403エラーではログインページへのリンクを表示するといった工夫ができます。こうした小さな配慮が、使いやすいWebサイトにつながっていきます。
共通エラーページとTwigの活用
個別のエラーだけでなく、すべてのエラーに共通するページを用意できる点もSymfonyの便利なところです。error.html.twig を作成すれば、404や403以外のエラーが発生した場合でも、統一感のある画面を表示できます。Twigテンプレートエンジンを使えば、{{ status_code }} のようにエラーコードを動的に表示することも可能です。
TwigはHTMLに近い書き方ができるため、プログラミング初心者でも比較的理解しやすいテンプレートエンジンです。エラーページの中で変数を表示したり、共通レイアウトを使ったりすることで、デザインと処理をきれいに分けて管理できます。
初心者向けのシンプルなエラーページ例
最後に、最低限の情報だけを表示する、とてもシンプルなエラーページの例を見てみましょう。まずは難しく考えず、「何が起きたのか」と「次にどうすればいいか」を伝えることが大切です。
{# templates/bundles/TwigBundle/Exception/error404.html.twig #}
<!DOCTYPE html>
<html>
<head>
<title>ページが見つかりません</title>
</head>
<body>
<h1>404エラー</h1>
<p>お探しのページは存在しないようです。</p>
<a href="/">トップページへ戻る</a>
</body>
</html>
このような画面を用意するだけでも、利用者にとっては安心感が大きく変わります。デザインや文章は、サイトの雰囲気に合わせて少しずつ調整していきましょう。
生徒
「Symfonyって、エラー画面までちゃんと自分で作れるんですね。英語の画面が出なくなるだけでも安心です。」
先生
「そうですね。エラーページは見落とされがちですが、ユーザー体験に大きく関わる部分です。」
生徒
「404と403で意味が違うことも、今回でしっかり理解できました。」
先生
「その理解はとても大切です。それぞれに合った案内を出せるようになりますからね。」
生徒
「まずはシンプルなエラーページから作って、少しずつ見た目も工夫してみます。」
先生
「それが一番です。Symfonyのエラー処理に慣れてくると、安心してアプリを公開できるようになりますよ。」