メインメニュー
XAMPP アレンジ
IED
WSL2
-
道具箱
リポジトリ編
フレームワーク編
公開ソフトウェア
メタ
リンク
- PHP ライブラリ
- PHP 言語
apricot:app:errorApricot エラー画面
— y2sunlight 2020-05-09
関連記事
-
エラー画面の設定
エラー画面を表示するアクションメソッドは通常の(リクエストルータ経由の)アクションとは異なり、集約例外ハンドラーから呼び出されます。このアクションメソッドの設定は以下の設定ファイルで行います。 これは既に各種コアクラスの集約エラーハンドラの項で説明済ですが、念のため以下に再掲しておきます。
設定ファイル
/apricot/config/setting
- whoops.setting.php
<?php return [ 'debug' => env('APP_DEBUG',false), 'controller' => \App\Exceptions\UncaughtExceptionHandler::class, 'action' => 'render', ];
- debug — デバッグモード(既定値は 環境変数APP_DEBUGの値)
- controller — 本番用エラー画面のコントローラクラス
- action — 本番用エラー画面のアクションメソッド
集約例外コントローラ
集約例外ハンドラーから呼び出されるコントローラを集約例外コントローラと呼びます。whoops.setting.php での設定に従い UncaughtExceptionHandler@render メソッドが実行されてエラー画面を表示します。以下に集約例外コントローラを示します。
/apricot/app/Exceptions
- UncaughtExceptionHandler.php
<?php namespace App\Exceptions; /** * Uncaught Exception Handler */ class UncaughtExceptionHandler { /** * Render uncaught exception * @param \Throwable $exception */ public function render(\Throwable $exception) { if ($exception instanceof \Core\Exceptions\TokenMismatchException) { // CSRFエラーなどのトークンエラーは419(Page Expired) $status_code = 419; } elseif ($exception instanceof \Core\Exceptions\HttpException) { $status_code = $exception->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になっています。
/apricot/assets/views/error
- layout.blade.php
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>{{__('messages.app.title')}}</title> <!-- Fonts --> <link rel="dns-prefetch" href="//fonts.gstatic.com"> <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet" type="text/css"> <!-- Styles --> <style> html, body { background-color: #fff; color: #636b6f; font-family: 'Nunito', sans-serif; font-weight: 100; height: 100vh; margin: 0; } .full-height { height: 100vh; } .flex-center { align-items: center; display: flex; justify-content: center; } .flex-row { flex-direction: column; } .position-ref { position: relative; } .code { border-right: 2px solid; font-size: 26px; padding: 0 15px 0 15px; text-align: center; } .message { font-size: 18px; text-align: center; } .mb { margin-bottom:1em; } </style> </head> <body> <div class="flex-center position-ref full-height"> @yield('content') </div> </body> </html>
error.exception
以下に集約例外コントローラでレンダリングしているHTMLテンプレート( error.exception )を示します。
/apricot/assets/views/error
- exception.blade.php
{{-- 親レイアウト --}} @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 <div class="code">{{$status_code}}</div> <div class="message" style="padding: 10px;">{{ $message }}</div> @endsection
テスト実行
エラー画面を表示してみましょう。
.envを以下のように修正してデバッグモードから本番モードに変更します。
デバッグモードの時は集約エラーハンドラーは実行されません(その代わりに Whoops提供のPrettyErrorHandlerのデバッグ画面が表示されます )。/apricot
- .env
... APP_DEBUG=false ...
ブラウザ上で以下のURLにアクセスしてみて下さい。
http://localhost/ws2019/apricot/public/users
次の画面が表示されます
テスト後は、.envを元に戻しておいて下さい。
- .env
... APP_DEBUG=true ...
apricot/app/error.txt · 最終更新: 2020/07/01 13:34 by tanaka
コメント
https://www.adidasnmdr1.us.org/ https://www.balenciagaofficial.us.com/ https://www.jordan11red.us.com/ https://www.airjordanretro11.us.com/ https://www.jordan13s.us/ https://www.jordanretros.us.com/ https://www.retrosjordans.us/ https://www.airjordan1s.us.org/ https://www.pandorajewellery.us.com/ https://www.nmds.us.com/ https://www.jordans1s.us.com/ https://www.jordansretro12.us/ https://www.fitflop-shoes.us.org/ https://www.air-jordanssneakers.us/ https://www.air-jordan6.us.com/ https://www.outletnikestore.us.com/ https://www.adidasyeezysneakers.us.com/ https://www.jordans1.us.com/ https://www.asics-running-shoes.us.com/ https://www.jordan-12.us.com/ https://www.goldensgoose.us.com/ https://www.nikeoutletfactorys.us.com/ https://www.jamesharden-shoes.us.org/ https://www.shoeslouboutin.us.com/ https://www.pandorascharms.us.com/ https://www.jordan11sshoes.us/ https://www.redbottomslouboutin.us.org/ https://www.air-jordans11.us.com/ https://www.mensnikeshoes.us.com/ https://www.airjordanshoess.us.com/ https://www.birkin-bag.us.com/ https://www.jordanshoesretro.us.com/ https://www.jordansretro3.us/ https://www.redbottomshoesforwomen.us.com/ https://www.jordans11.us.com/ https://www.pandoraringssite.us/ https://www.jordansshoesforsale.us.com/ https://www.airmax270.us.org/ https://www.nikeoutletstoresonlineshopping.us.com/ https://www.lebron-shoes.us.com/ https://www.jordan1.us.com/ https://www.goldengoosessneakers.us.com/ https://www.nikefactoryoutlets.us.org/ https://www.air-jordan12.us/ https://www.airjordan5.us/ https://www.air-jordan4.us.com/ https://www.airjordan3s.us/ https://www.newjordansshoes.us.com/ https://www.pandorasjewelry.us.com/ https://www.vanscom.us.com/ https://www.jordans-sneakers.us.com/ https://www.redbottomshoeslouboutin.us.com/ https://www.fjallraven-kanken.us.com/ https://www.jordanretro11mens.us/ https://www.yeezyonline.us.com/ https://www.nikesales.us.com/ https://www.jordans5.us/ https://www.jordan-retro6.us/ https://www.jordan1universityblue.us.com/ https://www.jordan-retro1.us.com/ https://www.retro-jordans.us/ https://www.louboutinshoesheels.us.com/ https://www.ggdbsneakers.us.com/ https://www.air-jordan1s.us.com/ https://www.valentinosshoes.us.org/ https://www.airmax-95.us.com/ https://www.new-jordans.us.com/ https://www.yeezy.us.org/ https://www.newnikeshoes.us.com/ https://www.nikeairmax98.us/ https://www.pandorajewelryofficial-site.us/ https://www.nikesoutletstoreonlineshopping.us.com/ https://www.eccos.us.com/ https://www.pandoracanadajewelry.ca/ https://www.jordan11low.us.com/ https://www.outletgoldengoose.us.com/ https://www.jordan9.us.com/ https://www.yeezys-shoes.us.com/ https://www.air-jordansneakers.us/ https://www.pandoras.us.com/ https://www.balenciagatriples.us.org/ https://www.nikesfactory.us.com/ https://www.sneakersgoldengoose.us.com/ http://www.pandorarings.us.com/ https://www.nike-jordans.us.com/ https://www.jordan14.us.com/ https://www.nikeofficialwebsite.us.com/ https://www.christian-louboutinheels.us.com/ https://www.soccercleats.us.com/ https://www.yeezys.com.co/ https://www.nikeshoesoutletfactory.us.com/ https://www.airjordansnew.us.com/ https://www.jordanscheapshoes.us/ https://www.airjordan4s.us/ https://www.jordanretro-11.us.com/ https://www.jordan-4.us.com/ https://www.air-jordan6.us/ https://www.pandoraonline.us/ https://www.nikeairmax-shoes.us.com/ https://www.nike-airmax2018.us.com/ https://www.monclerstores.us.com/ https://www.jordan13.us.org/ https://www.jordans-11.us/ https://www.nikesnkrs.us.com/ https://www.christianslouboutinshoes.us.com/ https://www.retrosairjordan.us/ https://www.goldengooseshoess.us.com/ https://www.jordan1lows.us.com/ https://www.newjordan11.us/ https://www.ferragamos.us.org/ https://www.jordans-4.us/ https://www.pandora-braceletcharms.us/ https://www.monclervest.us.com/ https://www.nikeshoesforwomens.us.com/ https://www.monclerjacketsstore.us.com/ https://www.nike--shoes.us.com/ https://www.adidasyeezysshoes.us.com/ https://www.airforceoneshoes.us.com/ https://www.ggdbshoes.us.com/ https://www.nikeairjordan.us.com/ https://www.jordan12retro.us.com/ https://www.airjordan6rings.us/ https://www.jordan11ssneakers.us/ https://www.airjordan11s.us.com/ https://www.kyrieirving-shoes.us.org/ https://www.jordan-shoesformen.us.com/ https://www.air-max90.us.com/ https://www.yeezys-shoes.us.org/ https://www.jordan-8.us/ https://www.goldengoosesales.us.com/ https://www.nikeshoes-cheap.us.com/ https://www.huarachesnike.us.com/ https://www.coatsmoncler.us.com/ https://www.nikeair-jordan1.us.com/ https://www.christianlouboutinshoesinc.us.com/ https://www.jordan5.us.com/ https://www.nikeoutletshoes.us.com/ https://www.airjordansneakers.us.com/ https://www.nikeair-maxs.us.com/ https://www.jordan10.us.com/ https://www.goldengoosemidstar.us.com/ https://www.jacketsmoncleroutlet.us.com/ https://www.jordanshoess.us.com/ https://www.christianslouboutin.uk.com/ https://www.goldengooseoutletfactory.us.com/ https://www.monclercom.us.com/ https://www.ggdbs.us.com/ https://www.airmax270s.us.com/ https://www.pandorajewelryofficialsite.us.com/ https://www.jordan12retros.us/ https://www.jordans4retro.us/ https://www.canadapandoracharms.ca/ https://www.jordansneakerss.us/ https://www.goldengoosesneakerss.us.com/