Laravelのエラー画面をカスタマイズする方法!errors/xxx.blade.phpの使い方を初心者向けに解説
生徒
「Laravelで404エラーや500エラーが出たとき、デフォルトの味気ない画面じゃなくて、自分でデザインしたページを表示させることってできますか?」
先生
「できますよ。resources/views/errorsフォルダにbladeファイルを置くだけで、エラー画面を自由にカスタマイズできます。難しい設定は何も必要ありません。」
生徒
「そんなに簡単なんですか?実際にどう作ればいいか教えてもらえますか?」
先生
「もちろんです。ファイルの置き場所から具体的な書き方まで、順を追って説明しますね!」
1. Laravelのエラー画面カスタマイズとは?
Webサイトやアプリを使っているとき、存在しないページにアクセスしたり、サーバーで問題が起きたりするとエラー画面が表示されます。よく見かけるものとして「404 Not Found(ページが見つかりません)」や「500 Internal Server Error(サーバーエラー)」などがあります。
Laravelを初期設定のままで使っていると、エラーが起きたときにLaravelが用意したシンプルなデフォルト画面が表示されます。この画面は機能的には問題ありませんが、サービス全体のデザインと統一感がなく、ユーザーに不安を与えてしまうこともあります。
そこで役立つのがエラー画面のカスタマイズです。自分でデザインしたエラーページを用意することで、エラーが起きたときでもユーザーに丁寧なメッセージを伝えたり、サイトのデザインに合った見た目を保ったりすることができます。Laravelではこのカスタマイズがとても簡単な仕組みになっています。
2. エラーページファイルの置き場所と命名ルール
Laravelでエラー画面をカスタマイズするには、resources/views/errorsというフォルダの中にbladeファイルを作るだけです。bladeファイルとは、LaravelでHTML画面を作るための専用ファイル形式で、拡張子が.blade.phpになります。
ファイルの命名ルールはとてもシンプルで、エラーのHTTPステータスコードをそのままファイル名にするだけです。たとえば404エラーのカスタムページを作りたければ404.blade.php、500エラーなら500.blade.phpというファイル名にします。
HTTPステータスコードとは、Webサーバーがブラウザに返す「状態を表す3桁の数字」のことです。よく使うコードを確認しておきましょう。
| ステータスコード | 意味 | ファイル名 |
|---|---|---|
| 404 | ページが見つからない | 404.blade.php |
| 403 | アクセス権限がない | 403.blade.php |
| 500 | サーバー内部エラー | 500.blade.php |
| 503 | サービス一時停止中 | 503.blade.php |
このファイルを置くだけでLaravelが自動的に認識して、対応するエラーが発生したときにそのファイルを表示してくれます。特別なルーティング(URLとページの対応付け)の設定も必要ありません。
3. 404エラーページを作ってみよう
まず最もよく使う404エラーページを実際に作ってみましょう。resources/views/errors/404.blade.phpというファイルを新しく作成して、以下の内容を書きます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>404 - ページが見つかりません</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
</head>
<body class="bg-light">
<div class="container text-center mt-5">
<h1 class="display-1 fw-bold text-danger">404</h1>
<p class="fs-4">お探しのページは見つかりませんでした。</p>
<p class="text-muted">URLが間違っているか、ページが移動・削除された可能性があります。</p>
<a href="/" class="btn btn-primary mt-3">トップページへ戻る</a>
</div>
</body>
</html>
このファイルを保存したら、存在しないURLにアクセスしてみてください。Laravelのデフォルト画面ではなく、自分で作ったデザインのページが表示されるようになります。BootStrap5を読み込んでいるので、スタイルが整ったきれいなページになります。
4. レイアウトを共通化してエラーページを作る方法
サイト全体でヘッダーやフッターを共通のデザインにしている場合、エラーページもその共通レイアウトを使って作ることができます。Laravelのbladeテンプレートにはレイアウト継承という仕組みがあり、親となる共通レイアウトファイルを呼び出して使い回せます。
たとえばresources/views/layouts/app.blade.phpという共通レイアウトが用意されている場合、エラーページから以下のように呼び出せます。
{{-- resources/views/errors/404.blade.php --}}
@extends('layouts.app')
@section('title', '404 - ページが見つかりません')
@section('content')
<div class="container text-center mt-5">
<h1 class="display-1 fw-bold text-danger">404</h1>
<p class="fs-4">お探しのページは見つかりませんでした。</p>
<p class="text-muted">URLが間違っているか、ページが移動した可能性があります。</p>
<a href="/" class="btn btn-primary mt-3">トップページへ戻る</a>
</div>
@endsection
@extends('layouts.app')は「layouts/app.blade.phpを親レイアウトとして使う」という宣言です。@sectionと@endsectionで囲まれた部分が、親レイアウトの@yieldという場所に挿入されます。この仕組みを使うと、ヘッダーやナビゲーションバーも含めた統一感のあるエラーページが作れます。
5. エラーページでエラーメッセージを表示する方法
カスタムエラーページの中では、$exceptionという変数を使ってエラーの情報を取得することができます。変数とはデータを入れておく箱のようなものです。$exceptionには発生した例外(エラー)の詳細情報が入っています。
ただし本番環境(実際にユーザーが使う環境)では詳しいエラー内容を画面に表示すると、セキュリティ上のリスクになることがあります。セキュリティとは、不正アクセスや情報漏えいから守るための対策のことです。そのため表示する情報は慎重に選ぶ必要があります。
{{-- resources/views/errors/500.blade.php --}}
@extends('layouts.app')
@section('title', '500 - サーバーエラー')
@section('content')
<div class="container text-center mt-5">
<h1 class="display-1 fw-bold text-warning">500</h1>
<p class="fs-4">申し訳ありません。サーバーでエラーが発生しました。</p>
<p class="text-muted">しばらく時間をおいてから再度アクセスしてください。</p>
<a href="/" class="btn btn-secondary mt-3">トップページへ戻る</a>
</div>
@endsection
500エラーのページでは技術的な詳細は表示せず、ユーザーへの丁寧なお詫びとトップページへの導線だけを表示するのがベストです。開発中に詳細なエラー情報を確認したい場合は、.envファイルでAPP_DEBUG=trueに設定しておくとエラー画面に詳細が表示されます。本番公開時は必ずAPP_DEBUG=falseに戻しましょう。
6. vendor:publishコマンドでLaravel標準のエラービューを取得する方法
Laravelには標準でエラーページのテンプレートが用意されており、それをベースにカスタマイズする方法もあります。テンプレートとは、あらかじめ用意された雛形のことです。以下のArtisanコマンドを実行すると、Laravelが内部で持っているエラービューのファイルを自分のプロジェクトにコピーできます。
// ターミナルで実行するコマンド
php artisan vendor:publish --tag=laravel-errors
このコマンドを実行するとresources/views/errorsフォルダに複数のbladeファイルが生成されます。生成されるのは404、419、429、500、503などのエラーページです。これらのファイルを開いて中身を見ると、Laravelが標準で使っているエラーページの書き方を確認できます。ゼロから作るのが難しいと感じる場合は、このファイルを改造するところから始めると取り組みやすくなります。
なお、このコマンドで生成したファイルはすべて自分のプロジェクト内のファイルになるため、自由に編集できます。元の状態に戻したくなった場合はファイルを削除すればLaravelのデフォルト表示に戻ります。
7. 503エラーページとメンテナンスモードの活用
Webサービスを運営していると、システムの更新やデータベースの変更のために一時的にサービスを停止する「メンテナンス」を行うことがあります。Laravelにはこのメンテナンス時間中にユーザーに503エラーページを見せる便利な機能が備わっています。
以下のコマンドを実行するとメンテナンスモードになり、アクセスしてきたユーザーに503ページが表示されます。
// メンテナンスモードを開始するコマンド
php artisan down
// メンテナンスモードを終了するコマンド
php artisan up
メンテナンス中に表示される画面もresources/views/errors/503.blade.phpを作ることでカスタマイズできます。「現在メンテナンス中です。終了予定時刻は〇〇時です。」のような丁寧なメッセージを用意しておくと、ユーザーへの印象がよくなります。
またphp artisan down --secret="合言葉"のように秘密のキーワードを設定しておくと、メンテナンス中でも特定のURLからアクセスすることで動作確認ができます。これにより本番環境でメンテナンス中の状態を確認しながら作業を進めることができ、とても実用的な機能です。