Ground Sunlight

Windowsで作る - Webプログラミングの開発環境(PHP)

ユーザ用ツール

サイト用ツール


apricot:usage:ja:errors-logging

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

次のリビジョン
前のリビジョン
apricot:usage:ja:errors-logging [2020/07/29 13:33]
tanaka 作成
apricot:usage:ja:errors-logging [2020/08/15 16:37] (現在)
y2sunlight
ライン 1: ライン 1:
-> 編集中 
- 
----- 
- 
 ====== Apricot ログとエラー処理 ====== ====== Apricot ログとエラー処理 ======
  --- //​[[http://​www.y2sunlight.com|y2sunlight]] 2020-07-29//​  --- //​[[http://​www.y2sunlight.com|y2sunlight]] 2020-07-29//​
  
-[[apricot:​usage:​ja|Apricotの使用法 ​に戻る]]+[[apricot:​usage:​ja|Apricot ​ドキュメント ​に戻る]]
  
 目次 目次
  
 +  * [[apricot:​usage:​ja:​features|Apricot 特徴と概要]]
   * [[apricot:​usage:​ja:​config|Apricot 配置と構成]]   * [[apricot:​usage:​ja:​config|Apricot 配置と構成]]
 +  * Apricot ログとエラー処理
   * [[apricot:​usage:​ja:​http|Apricot リクエストとレスポンス]]   * [[apricot:​usage:​ja:​http|Apricot リクエストとレスポンス]]
   * [[apricot:​usage:​ja:​frontend|Apricot フロントエンド]]   * [[apricot:​usage:​ja:​frontend|Apricot フロントエンド]]
ライン 16: ライン 14:
   * [[apricot:​usage:​ja:​middleware|Apricot ミドルウェア]]   * [[apricot:​usage:​ja:​middleware|Apricot ミドルウェア]]
   * [[apricot:​usage:​ja:​controller|Apricot コントローラ]]   * [[apricot:​usage:​ja:​controller|Apricot コントローラ]]
-  * Apricot ログとエラー処理 
   * [[apricot:​usage:​ja:​utility|Apricot ユーティリティ]]   * [[apricot:​usage:​ja:​utility|Apricot ユーティリティ]]
  
ライン 22: ライン 19:
  
 ===== ロギング ===== ===== ロギング =====
->TODO+ 
 +ロギングは、[[https://​github.com/​Seldaek/​monolog|monolog]]をラップした ''​Apricot\Log''​ シングルトンが担当します。機能的には monolog と同じですが、[[https://​www.php-fig.org/​psr/​psr-3/​|PSR-3]]に従って使います。 
 + 
 +使用法: **Log::​{メソッド}** 
 + 
 +^メソッド^機能^ 
 +|void emergency(string $message, array $context = [])|emergencyレベルのログ| 
 +|void alert(string $message, array $context = [])|alertレベルのログ| 
 +|void critical(string $message, array $context = [])|criticalレベルのログ| 
 +|void error(string $message, array $context = [])|errorレベルのログ| 
 +|void warning(string $message, array $context = [])|warningレベルのログ| 
 +|void notice(string $message, array $context = [])|noticeレベルのログ| 
 +|void info(string $message, array $context = [])|infoレベルのログ| 
 +|void debug(string $message, array $context = [])|debugレベルのログ| 
 +|void log($level, string $message, array $context = [])|任意レベルのログ| 
 + 
 +使用例:​ 
 + 
 +<code php> 
 +use Apricot\Log;​ 
 +Log::​exception('​error',​$e);​ 
 +</code>
  
 \\ \\
  
-===== エラーハンドラーの設定 ===== +=== 設定ファイル ​==
->TODO+ 
 +ロギングには以下の設定ファイルが存在します。 
 + 
 +{{fa>​folder-open-o}} ** {your-project}/​config/​setting ** 
 +<code php monolog.setting.php>​ 
 +<?php 
 +/** 
 + * This file contains Monolog settings. 
 + */ 
 +return 
 +
 +    '​name'​ => env('​LOG_NAME',​env('​APP_NAME'​)),​ 
 +    '​path'​ => env('​LOG_PATH',​var_dir('​logs'​)),​ 
 +    '​level'​=>​ env('​LOG_LEVEL','​debug'​),​ 
 +    '​max_files'​=>​ 0, 
 +]; 
 +</​code>​ 
 + 
 +  * name --- ログの名前 (初期設定は、環境変数APP_NAME(無ければAPP_NAME)の値) 
 +  * path --- ログの出力パス (初期設定は、var/​logs/​) 
 +  * level --- ログの出力レベル (初期設定は、'​debug'​) 
 +  * max_files --- ログファイルの最大保存数 (初期設定は、0(無制限)) 
 + 
 +\\ 
 + 
 +===== 集約例外ハンドラー ===== 
 + 
 +Apricotでは例外ハンドラーとして[[https://​github.com/​filp/​whoops|Whoops]]を使います。コントローラで捕捉されなかった例外は、最終的にこの例外ハンドラーで捕捉するので、これは集約例外ハンドラーと呼ばれます。 
 + 
 +集約例外ハンドラーの動作にはデバッグモードと本番モードがあります。 
 + 
 +  * デバッグモード --- ログ出力して、例外内容とスタックトレースを表示する 
 +  * 本番モード --- ログ出力して、利用者向けのエラーページを表示する 
 + 
 +これらの動作をカスタマイズするには、以下のWhoopsのセットアップファイルを変更して下さい。 
 + 
 +セットアップファイル: 
 +<​code>​ 
 +{your-project}/​config/​setup/​whoops.setup.php 
 +</​code>​ 
 + 
 +\\ 
 + 
 +=== 設定ファイル === 
 + 
 +例外ハンドラーには以下の設定ファイルが存在します。 
 + 
 +{{fa>​folder-open-o}} ** {your-project}/​config/​setting ** 
 +<code php whoops.setting.php>​ 
 +<?php 
 +/** 
 + * This file contains Whoops settings. 
 + */ 
 +return 
 +
 +    '​debug' ​=> env('​APP_DEBUG',​false),​ 
 +    '​controller' ​=> \App\Exceptions\UncaughtExceptionHandler::​class,​ 
 +    '​action'​ => '​render',​ 
 +]; 
 +</​code>​ 
 + 
 +  * debug --- デバッグモードの場合 true (初期設定は、環境変数APP_DEBUGの値。無ければfalse) 
 +  * controller --- 集約例外コントローラクラスを指定する (次項参照) 
 +  * action --- 集約例外コントローラのアクションメソッド名を指定する (次項参照) 
 + 
 +\\ 
 + 
 +=== 集約例外コントローラ ​=== 
 + 
 +本番モードで集約例外ハンドラーから呼び出されるコントローラを集約例外コントローラと呼びます。上述の whoops.setting.php での設定に従い、例外発生時に ''​UncaughtExceptionHandler''​ クラスの ''​render()''​ メソッドが実行されてエラーページを表示します。 
 + 
 +初期実装されている集約例外コントローラでは、例外の種類に応じてHTTPステータスコードを以下のように設定します。 
 + 
 +  * CSRFエラーなどの TokenMismatchException( トークンエラー )は419( Page Expired )に設定 
 +  * HttpException( ヘルパー関数 ''​abort()''​ によるHTTP例外 )はそのステータスコードを使用 
 +  * その他の例外は 500( Internal Server Error )に設定 
 + 
 +集約例外コントローラは以下に配置されています。必要に応じてカスタマイズできます。 
 + 
 +<code> 
 +{your-project}/​app/​Exceptions/​UncaughtExceptionHandler.php 
 +</​code>​ 
 + 
 +\\ 
 + 
 +===== コアの例外クラス ===== 
 + 
 +Exceptionを継承した2つの例外クラスがあります。 
 + 
 +  * ''​Apricot\Exceptions\HttpException''​ \\ HTTP例外(HTTPステータスコード400番台,​500番台) 
 +  * ''​Apricot\Exceptions\TokenMismatchException''​ \\ トークンミスマッチ例外(CSRFトークンなどの不一致) 
 + 
 +\\ 
 + 
 +===== アプリの例外クラス ===== 
 + 
 +''​App\Exceptions\ApplicationException''​ はアプリで発生する例外クラスのベースクラスで、Exceptionクラス から派生しています。そして、ApplicationExceptionから派生した以下のクラスがあります。 
 + 
 +  * ''​App\Exceptions\OptimissticLockException''​ \\ 楽観的ロック例外 
 + 
 +\\ 
 + 
 +===== エラーバッグ ===== 
 + 
 +エラーバッグ( ''​Apricot\Foundation\ErrorBag''​ )は、入力エラーなどの業務的なエラー(例外でないエラー)の為のクラスです。ErrorBag は [[apricot:​usage:​ja:​controller#​ValidatorErrorBagクラス]] のベースクラスです。 
 + 
 +ErrorBag には名前を付けることができます。バッグ内のエラーはキー付きの連想配列で保存されています。ErrorBagには以下のメソッドがあります。 
 + 
 +^メソッド^機能^ 
 +|<​nowiki>​__</​nowiki>​construct(array $errors=null,​ string $name=self::​DEFAULT_NAME)|エラーバッグの生成| 
 +|count(string $name=null):​int|エラー数の取得| 
 +|has(string $key, string $name=self::​DEFAULT_NAME):​bool|キーによるエラーの存在確認| 
 +|get(string $key, string $name=self::​DEFAULT_NAME)|キーによるエラーの取得| 
 +|all(string $name=null):​array|全てのエラーの取得| 
 +|put($errors)|エラー配列の設定| 
 + 
 +エラーバッグは[[https://​www.php.net/​manual/​ja/​class.iteratoraggregate.php|IteratorAggregateインターフェース]]を実装してるのでforeach()などのIteratorを使用した構文が使用できます。但し、Countable インターフェイス は実装していないので、count関数ではなくErrorBag@countメソッドを使用して下さい。
  
 \\ \\
  
apricot/usage/ja/errors-logging.1595997190.txt.gz · 最終更新: 2020/07/29 13:33 by tanaka