====== Apricot エラー画面 ====== --- //[[http://www.y2sunlight.com|y2sunlight]] 2020-05-09// [[apricot:top|Apricot に戻る]] 関連記事 * [[apricot:configuration|Apricot プロジェクトの作成]] * [[apricot:public|Apricot 公開フォルダ]] * [[apricot:core:top|Apricot コア]] * Apricot アプリ * [[apricot:app:top|Apricot アプリ作成の準備]] * [[apricot:app:home|Apricot ホーム画面]] * Apricot エラー画面 * [[apricot:app:db-model|Apricot データベースとモデル]] * [[apricot:app:user-list|Apricot ユーザ一覧画面]] * [[apricot:app:user-edit|Apricot ユーザ登録画面]] * [[apricot:app:validation|Apricot バリデーション]] * [[apricot:app:transaction|Apricot トランザクション]] * [[apricot:ext:middleware|Apricot 拡張]] アプリのエラー画面を作ります。\\ エラー画面は集約例外ハンドラー([[basic-library:whoops:2.7|Whoops]])から呼び出されます。 ---- ===== エラー画面の設定 ===== エラー画面を表示するアクションメソッドは通常の(リクエストルータ経由の)アクションとは異なり、集約例外ハンドラーから呼び出されます。このアクションメソッドの設定は以下の設定ファイルで行います。 これは既に[[apricot:core:basic-class|各種コアクラス]]の[[apricot:core:basic-class#集約例外ハンドラー|集約エラーハンドラ]]の項で説明済ですが、念のため以下に再掲しておきます。 === 設定ファイル === {{fa>folder-open-o}} ** /apricot/config/setting ** env('APP_DEBUG',false), 'controller' => \App\Exceptions\UncaughtExceptionHandler::class, 'action' => 'render', ]; * debug --- デバッグモード(既定値は 環境変数APP_DEBUGの値) * controller --- 本番用エラー画面のコントローラクラス * action --- 本番用エラー画面のアクションメソッド \\ ===== 集約例外コントローラ ===== 集約例外ハンドラーから呼び出されるコントローラを集約例外コントローラと呼びます。whoops.setting.php での設定に従い UncaughtExceptionHandler@render メソッドが実行されてエラー画面を表示します。以下に集約例外コントローラを示します。 {{fa>folder-open-o}} ** /apricot/app/Exceptions ** getStatusCode(); } else { // その他のエラーは500(Internal Server Error) $status_code = 500; } // エラー画面を表示する render('error.exception', ['status_code'=>$status_code])->commit($status_code); } } * 例外の種類に応じて表示用のステータスコードを設定します。 * CSRFエラーなどの TokenMismatchException( トークンエラー )は419( Page Expired )に設定 * HttpException( ヘルパー関数 ''abort()'' によるHTTP例外 )はそのステータスコードを使用 * その他の例外は 500( Internal Server Error )に設定 * ヘルパー関数 render() を呼び出してレスポンスをレンダリングしています * **render(string $view=null, array $variables=[])** - $view : テンプレート名\\ 上例では assets/views/error/exception.blade.php がテンプレートファイルになります - $variables : テンプレート変数の連想配列\\ 上例では $status_codeをテンプレートに渡しています。 * commit()メソッドはレンダリングされたHTMLを確定してレスポンスを送信します \\ ===== HTMLテンプレート ===== エラー画面のレイアウトは以下の2つのHTMLテンプレートから成っています。 * error.layout --- エラー画面共通のレイアウト * error.exception --- 集約例外コントローラが使用する画面内容 テンプレート error.exception は、error.layout から継承して作成します。 ==== error.layout ==== 以下にエラー画面共通のレイアウト( error.layout )を示します。CSSやJavaScriptも使用せずに出来るだけシンプルなHTMLになっています。 {{fa>folder-open-o}} ** /apricot/assets/views/error ** {{__('messages.app.title')}}
@yield('content')
==== error.exception ==== 以下に集約例外コントローラでレンダリングしているHTMLテンプレート( error.exception )を示します。 {{fa>folder-open-o}} ** /apricot/assets/views/error ** {{-- 親レイアウト --}} @extends('error.layout') {{-- コンテンツ --}} @section('content') @php switch ($status_code) { case 400: $message = 'Bad Request'; break; case 401: $message = 'Unauthorized'; break; case 403: $message = 'Forbidden'; break; case 404: $message = 'Not Found'; break; case 405: $message = 'Method Not Allowed'; break; case 408: $message = 'Request Timeout'; break; case 414: $message = 'URI Too Long'; break; case 419: $message = 'Page Expired'; break; case 500: $message = 'Internal Server Error'; break; case 503: $message = 'Service Unavailable'; break; default: $message = 'Error'; break; } @endphp
{{$status_code}}
{{ $message }}
@endsection
\\ ===== テスト実行 ===== エラー画面を表示してみましょう。 .envを以下のように修正してデバッグモードから本番モードに変更します。 > デバッグモードの時は集約エラーハンドラーは実行されません(その代わりに Whoops提供のPrettyErrorHandlerのデバッグ画面が表示されます )。 {{fa>folder-open-o}} ** /apricot ** ... APP_DEBUG=false ... ブラウザ上で以下のURLにアクセスしてみて下さい。 http://localhost/ws2019/apricot/public/users 次の画面が表示されます [{{apricot:app:app03.png?nolink}}] \\ テスト後は、.envを元に戻しておいて下さい。 ... APP_DEBUG=true ... \\