😎

Laravelでエラーページをハンドリング

2023/09/10に公開

はじめに

Laravelで画面によって独自のエラーページを変えたい、
また、特定の処理ではエラーページを変えたいといった場合の
対応方法を備忘録として残しておきます。

独自のエラーページを作成する場合

Laravelのデフォルトでは「resources/views/errors/」を参照します。

例えば、404・403の独自のエラーページを作成する場合は
以下のように上記ディレクトリに設置します。

  • 403.blade.php ※403エラー時に表示
  • 404.blade.php ※404エラー時に表示

ただ、もしフロントと管理画面で別のエラーページを表示する必要がある場合、
それぞれテンプレートを分ける必要があります。

画面によって独自のエラーページを変える方法

独自のエラーページを分ける方法は、「app/Exceptions/Handler.php」で
registerErrorViewPaths() メソッドをオーバライドします。

以下の例では、フロントはデフォルトの「resources/views/errors/」を参照し、
管理画面では「resources/views/admin/errors/」を参照し対応しています。

app\Exceptions\Handler.php
    /**
     * Register the error template hint paths.
     *
     * @return void
     */
    protected function registerErrorViewPaths()
    {
        $paths = collect(config('view.paths'));

        View::replaceNamespace('errors', $paths->map(function ($path) {
            // URLのディレクトリが /admin で始まる場合
            if(strpos(Request::path(),'english/') === 0) {
                $path .= '/admin';
            }
            return "{$path}/errors";
        })->push(__DIR__.'/views')->all());
    }

特定の処理で独自のエラーページを変える方法

例えば、ファイルダウンロードの有効期限切れ時のみ403エラーページの文言を変えたい場合、
Laravelでは、任意のHTTPステータスコードとビューファイルを
レスポンスとして返せるため、これを利用できます。

  • Controller
/app/Http/Controllers/DownloadController.php
public function download()
{
    $message = ['message' => 'ファイルダウンロードの有効期限切れです。'];
    return response()->view('download.error', $message, 403);
}
  • View
resources/views/download/error.blade.php
<p>{{$message}}</p>

参考記事

Discussion