はじめに (対象読者・この記事でわかること)

この記事は、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エラーを独自のビューにリダイレクトします。

Php
public 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へのアクセスを正しく処理できるようにします。必要に応じて、以下のようなフォールバックルートを追加します。

Php
Route::fallback(function () { return response()->view('errors.404', [], 404); });

このルートは、他のどのルートにも一致しないすべてのリクエストを捕捉し、404エラーページを表示します。

ハマった点やエラー解決

エラー:ErrorException (E_ERROR) Undefined variable:

このエラーは、404ページで未定義の変数を使用しようとした場合に発生します。例えば、404.blade.phpで$titleのような変数を使用しているが、コントローラーでその変数を渡していない場合です。

解決策

404ページで使用する変数は、Handler.phpで明示的に渡す必要があります。Handler.phpを以下のように修正します。

Php
public 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エラーページのカスタマイズや、ログ記録の強化など、さらに高度なエラーハンドリングについても記事にする予定です。

参考資料