【Laravel5】エラーページ(500.blade.php)が呼ばれないときの対応
**はじめに
以下の手順でエラーページをカスタマイズ
(1) エラーページを作ってこちらに保存
resources/views/errors/500.blade.php
(2).envのAPP_DEBUG=falseに設定
で、わざとDBエラーが出るようにクエリを間違えて確認しようとしたら500.blade.phpは表示されずに
「Whoops, looks like something went wrong.」が、、、
ソースを見てみた
やり方違うのかと思ってソースを覗いてみた
vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.phpのrenderメソッドあたりが対象の箇所
resources/views/errors/[errors.status].blade.phpを呼び出している
Handler.php#renderメソッド
if ($this->isHttpException($e)) { return $this->toIlluminateResponse($this->renderHttpException($e), $e); } else { return $this->toIlluminateResponse($this->convertExceptionToResponse($e), $e); }
Hander.php#renderHttpExceptionメソッド
protected function renderHttpException(HttpException $e) { $status = $e->getStatusCode(); if (view()->exists("errors.{$status}")) { return response()->view("errors.{$status}", ['exception' => $e], $status, $e->getHeaders()); } else { return $this->convertExceptionToResponse($e); } }
Handler.php#convertExceptionToResponseメソッド
この中で「Whoops, looks like something went wrong」表示している
エラー用のテンプレートが表示されない場合は以下なのか
・対象のファイルが存在しない場合
・$this->isHttpExceptionがfalseの場合
で、$eのクラス名を見てみると「Illuminate\Database\QueryException」でこれは「HttpException」を継承していないので表示されないと解釈しました。
だとしたら他にもPHP実行時のエラーとかもこうなってしまうのか。。。これは嫌だな。。。
結論
正しいのかわからないけど今回は以下の対応とした
app/Exceptions/Handler.php#renderメソッド
public function render($request, Exception $e) { // ★追加 if (!$this->isHttpException($e)) { abort(500); } return parent::render($request, $e); }
いちおうやりたいことはできた、以上です