Laravelでのエラーの扱いとエラーページ
アプリケーションにはエラーや例外はつきものです。このエラーや例外をLaravelがどのように扱っているのか、を見ていきましょう。
すべてのエラーや例外はLaravelがキャッチ
エラーや例外というのは、開発途中では頻繁に発生し、それを修正することで、アプリケーションを完成へと近づけていきます。ところが、完成された状態のアプリケーションでも、エラーは発生し得ます。というのは、アプリケーションのユーザが想定外の使い方をしたり、アプリケーションが利用しているデータベースなど外部のシステムが想定外の動作をしたりすることがあるからです。そのため、アプリケーションを作成する際は、発生したエラーを適切に処理するように組み込む必要があります。
Laravelには、そのようなエラーへの対応もやりやすい仕組みが含まれています。それがLaravelのエラーハンドラです。Laravelは、そのアプリケーション内で発生したエラーや例外をすべてキャッチし、Laravel側で処理するようになっています。
例えば、前回のリスト9で作成したMagazineクラスのprint()をprnt()と間違えたとします。この状態で次のURLにアクセスすると、当然エラーとなります。
- http://localhost/firstlaravel/public/chap6/newBook
そのエラー画面は、図1のようになります。
このエラー画面は、Laravelのオリジナルであり、エラーが発生した箇所だけでなく、様々な情報を取得できるようになっています。このような画面が表示されるのは、すべてのエラーや例外をLaravel本体がキャッチできているからです。
環境変数APP_DEBUG
図1のエラー画面というのは、開発段階ではありがたい画面です。一方、本番環境では、このような画面を表示させるのはまずいです。その切り替えに便利な機能がLaravelにあります。 Laravelプロジェクトには、プロジェクトディレクトリ直下に.envファイルがあります。このファイルは、このプロジェクトの設定情報が環境変数の形で書かれているファイルです。この中に次の設定項目があります。
APP_DEBUG=true
この値を次のようにfalseにします。
APP_DEBUG=false
その上で、先のURLにもう一度アクセスすると、図2の画面になります。
図1の画面とは違い、エラー詳細が表示されなくなりました。このように、環境変数APP_DEBUGの値を、trueとfalseと切り替えることで開発モードのエラー表示と本番モードのエラー表示の切り替えが可能となります。
オリジナルのエラー画面
とはいえ、図2の画面はシンプルすぎて、これはこれで本運用には少し不親切です。実は、この画面は、オリジナルのものに差し替えることができます。方法はいたって簡単で、resources/views/errorsディレクトリ内に、HTTPステータスコードをファイル名としたテンプレートファイルを作成するだけです。図2のエラー画面は、その画面表記の通り、HTTPステータスコードは500番ですので、ファイル名は、500.blade.phpとなります。例えば、次のテンプレートファイルを作成したとします。
[リスト1]resources/views/errors/500.blade.php
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>障害発生!</title> </head> <body> <h1>障害発生!</h1> <p>申し訳ございません。</p> </body> </html>
すると、このファイルを作成するだけで、先のURLにアクセスした際の画面は図3となります。もちろん、APP_DEBUGの値はfalseとしておく必要はあります。
この方式を使えば、存在しないURLにアクセスしてきた際のエラー画面も、404.blade.phpというファイル名のテンプレートファイルを作成するだけで、オリジナルの画面が表示されるようになります。