読者です 読者をやめる 読者になる 読者になる

【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);
}

いちおうやりたいことはできた、以上です