Ground Sunlight

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

ユーザ用ツール

サイト用ツール


apricot:usage:ja:errors-logging

差分

このページの2つのバージョン間の差分を表示します。

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

次のリビジョン
前のリビジョン
次のリビジョン 両方とも次のリビジョン
apricot:usage:ja:errors-logging [2020/07/29 13:33]
tanaka 作成
apricot:usage:ja:errors-logging [2020/08/15 06:58]
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.txt · 最終更新: 2020/09/10 18:02 by y2sunlight