Laravelのエラーページについて
Laravelのエラーページをカスタマイズする際の注意点をまとめます。
[ 目次 ]
はじめに
こんにちは、香港に住んでいるWEBデベロッパーのなかむ(@nakanakamu0828)です。
今回はLaravelのエラーページについて記事を書いていきたいと思います。
通常 resources\views\errors
にステータスコードをファイル名としたエラーページを作成することでカスタマイズできます(ex. 404.blade.phpのようなエラーページのテンプレートを作成する)。
ただ、今回はMulti-Authで複数のユーザー認証機能が存在し、それぞれ用途とデザインを分けているため、エラーページもそれぞれ分けたいと思いました。
なので、App\Exceptions\Handler
を修正し、それぞれ用途ごとにテンプレートを表示するように制御しました。
認証機能は3つに分けています
- 一般ユーザー
- 企業ユーザー
- 管理画面のユーザー
resources\views
配下のディレクトリ構成も3つに分けていて
- 一般ユーザー : views\app
- 企業ユーザー : views\company
- 管理画面のユーザー : views\admin
としています。
※ 求職サイトを作っているので、「求職者がログインする画面」と「企業が求人を作成したりする管理画面」、「運営者がマスターデータの管理やサポート対応する管理画面」の3つが必要になりました。今回の記事はその案件がきっかけです。
■ 環境
ライブラリ | バージョン |
---|---|
PHP | ^7.1.3 |
Laravel | 5.7.* |
App\Exceptions\Handler
を修正
今回は以下のようにrender関数を修正しました。
public function render($request, Exception $e) {
return parent::render($request, $e);
}
↓
public function render($request, Exception $exception)
{
if($this->isHttpException($exception)) {
// URLのサブディレクトリで機能を分けているので、URLの構成からどのテンプレートにするか判断
$prefix = 'app';
if ($request->is('company*')) {
$prefix = 'company';
} elseif ($request->is('admin*')) {
$prefix = 'admin';
}
// ステータスコード毎にページを変更
// view関数の中でステータスコードを設定するのを忘れないように・・・、200でレスポンスが返されます
// 403
if($exception->getStatusCode() == 403) {
return response()->view($prefix . '.errors.403', [], $exception->getStatusCode());
}
// 404
if($exception->getStatusCode() == 404) {
return response()->view($prefix . '.errors.404', [], $exception->getStatusCode());
}
// 500
return response()->view($prefix . '.errors.500', [], $exception->getStatusCode());
}
return parent::render($request, $exception);
}
エラーページのディレクトリ構成
エラーページは以下のようなディレクトリ構成でファイルを作成しました。
resources/view/
|
+ - app/errors/
| |
| + - 403.blade.php
| + - 404.blade.php
| + - 500.blade.php
|
+ - company/errors/
| |
| + - 403.blade.php
| + - 404.blade.php
| + - 500.blade.php
|
+ - admin/errors/
| |
| + - 403.blade.php
| + - 404.blade.php
| + - 500.blade.php
最後に
Laravel5.7からデフォルトのエラーページが変わりました。結構素敵な画面だと思うので、個人開発のプロジェクトとかならそのままでもいいのかなと思ったりしました 笑
参考URL
こちらの記事を見ていて、「あれ?エラー画面なのにステータスコード 200で返されてるなー」とか思い、私のやったことも記事としてまとめておこうと思った次第です。