😎
Laravelでエラーページをハンドリング
はじめに
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