はじめに (対象読者・この記事でわかること)
この記事は、Laravelを使用したWeb開発をしている方、特にPHPのフレームワークLaravel6を使用している方を対象としています。この記事を読むことで、Laravel6で存在しないURLにアクセスした際に独自の404エラーページを表示する方法、および発生する可能性のあるErrorException (E_ERROR) Undefined variable: の原因と解決策を学ぶことができます。ルーティングとエラーハンドリングの設定方法を理解し、ユーザー体験を向上させるための実践的な知識を習得できます。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。 - PHPの基本的な知識 - Laravelの基本的な知識 - ルーティングの基本的な理解
Laravel6で404ページをカスタマイズする概要
Laravel6で存在しないURLにアクセスした際、デフォルトではErrorExceptionが表示されてしまいます。これはユーザー体験を損なうだけでなく、セキュリティ上の懸念も生じます。独自の404エラーページを表示することで、ユーザーに適切なフィードバックを提供し、サイトのプロフェッショナルな印象を与えることができます。
Laravelのエラーハンドリングシステムは、HTTPステータスコードに基づいて対応するビューを表示する仕組みになっています。404エラーの場合、resources/views/errors/404.blade.phpというファイルが存在すれば、それが自動的に表示されます。しかし、このファイルが存在しない場合や、設定が不十分な場合にはErrorExceptionが表示されてしまいます。
具体的な実装方法
ステップ1:404.blade.phpファイルの作成
まず、resources/views/errorsディレクトリに404.blade.phpファイルを作成します。このファイルに独自の404エラーページのデザインを実装します。
Html<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ページが見つかりません | サイト名</title> <link rel="stylesheet" href="{{ asset('css/style.css') }}"> </head> <body> <div class="container"> <h1>404 - ページが見つかりません</h1> <p>申し訳ありませんが、お探しのページは存在しません。</p> <a href="{{ url('/') }}">ホームに戻る</a> </div> </body> </html>
ステップ2:App\Exceptions\Handler.phpの設定
次に、app/Exceptions/Handler.phpファイルを編集して、404エラーを独自のビューにリダイレクトします。
Phppublic function render($request, Exception $exception) { if ($exception instanceof NotFoundHttpException) { return response()->view('errors.404', [], 404); } return parent::render($request, $exception); }
この設定により、NotFoundHttpException(存在しないURLへのアクセス)が発生した際に、404.blade.phpが表示されるようになります。
ステップ3:ルートの設定
routes/web.phpファイルを確認し、存在しないURLへのアクセスを正しく処理できるようにします。必要に応じて、以下のようなフォールバックルートを追加します。
PhpRoute::fallback(function () { return response()->view('errors.404', [], 404); });
このルートは、他のどのルートにも一致しないすべてのリクエストを捕捉し、404エラーページを表示します。
ハマった点やエラー解決
エラー:ErrorException (E_ERROR) Undefined variable:
このエラーは、404ページで未定義の変数を使用しようとした場合に発生します。例えば、404.blade.phpで$titleのような変数を使用しているが、コントローラーでその変数を渡していない場合です。
解決策
404ページで使用する変数は、Handler.phpで明示的に渡す必要があります。Handler.phpを以下のように修正します。
Phppublic function render($request, Exception $exception) { if ($exception instanceof NotFoundHttpException) { return response()->view('errors.404', [ 'title' => 'ページが見つかりません', 'message' => '申し訳ありませんが、お探しのページは存在しません。' ], 404); } return parent::render($request, $exception); }
そして、404.blade.phpでこれらの変数を使用します。
Html<h1>{{ $title }}</h1> <p>{{ $message }}</p>
追加のカスタマイズ
さらにカスタマイズしたい場合は、404.blade.phpでLaravelのレイアウトを使用することもできます。まず、resources/views/layoutsディレクトリにapp.blade.phpを作成します。
Html<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@yield('title', 'サイト名')</title> <link rel="stylesheet" href="{{ asset('css/style.css') }}"> </head> <body> <header> <!-- ヘッダー内容 --> </header> <main> @yield('content') </main> <footer> <!-- フッター内容 --> </footer> </body> </html>
次に、404.blade.phpを以下のように修正します。
Html@extends('layouts.app') @section('title', '404 - ページが見つかりません') @section('content') <div class="container"> <h1>404 - ページが見つかりません</h1> <p>申し訳ありませんが、お探しのページは存在しません。</p> <a href="{{ url('/') }}">ホームに戻る</a> </div> @endsection
まとめ
本記事では、Laravel6で存在しないURLにアクセスした際に独自の404エラーページを表示する方法を解説しました。
- 404.blade.phpファイルを作成して独自のデザインを実装
- App\Exceptions\Handler.phpで404エラーを独自のビューにリダイレクト
- ルートの設定で存在しないURLへのアクセスを適切に処理
- ErrorException (E_ERROR) Undefined variable: の解決策
この記事を通して、Laravelアプリケーションでユーザー体験を向上させる方法を学ぶことができたと思います。今後は、500エラーページのカスタマイズや、ログ記録の強化など、さらに高度なエラーハンドリングについても記事にする予定です。
参考資料
