目次

Apricot ログとエラー処理

y2sunlight 2020-07-29

Apricot ドキュメント に戻る

目次


ロギング

ロギングは、monologをラップした Apricot\Log シングルトンが担当します。機能的には monolog と同じですが、PSR-3に従って使います。

使用法: Log::{メソッド}

メソッド機能
emergency(string $message, array $context = [])emergencyレベルのログ
alert(string $message, array $context = [])alertレベルのログ
critical(string $message, array $context = [])criticalレベルのログ
error(string $message, array $context = [])errorレベルのログ
warning(string $message, array $context = [])warningレベルのログ
notice(string $message, array $context = [])noticeレベルのログ
info(string $message, array $context = [])infoレベルのログ
debug(string $message, array $context = [])debugレベルのログ
log($level, string $message, array $context = [])任意レベルのログ

使用例:

use Apricot\Log;
Log::exception('error',$e);


設定ファイル

ロギングには以下の設定ファイルが存在します。

/your-project/config/setting

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,
];


デバッグ出力

Apricotではオンサイトでのデバッグ出力機能を実現するために、php-debugbarを採用しています。そして、Apricotのコアでは、php-debugbarが提供している \DebugBar\StandardDebugBar クラスをカスタマイズした Apricot\Derivations\StandardDebugBar を作り、この機能をアプリケーションに提供しています。

DebugBarクラス

DebugBar クラスはカスタマイズされたStandardDebugBarをラップしたシングルトンで、アプリケーションにデバック出力機能を提供しています。

使用法: DebugBar::{メソッド}

メソッド機能
renderHead():stringHTMLヘッダー用のレンダリング文字列を返す
render():mixedHTMLボディー用のレンダリング文字列を返す
getCollector(string $name=“messages”):
\DataCollector\DataCollectorInterface
デバッグ出力用のコレクターの取得

こららのメソッドの内、renderHead()render() はHTMLテンプレートで使用され、ブラウザ上にデバッグ出力をレンダリングします。また、getCollector() は以下で示す Debugクラスの生成で使用されます。


Debugクラス

Debug クラスは、実際にデバッグ出力を行うクラスです。機能的にはDebugBarのコレクター( DataCollectorInterface )と同じですが、ロギングと同様にPSR-3に従って以下のように使います。以下の関数は基本的に var_dump() と同じように変数の内容をダンプします (これらの関数の違いは単に出力レベルが付いているだけです)。Debug::debug($this) とすれば自分のメンバ変数が全てダンプされます。

使用法: Debug::{メソッド}

メソッド機能
emergency($message, array $context = [])emergencyレベル
alert($message, array $context = [])alertレベル
critical($message, array $context = [])criticalレベル
error($message, array $context = [])errorレベル
warning($message, array $context = [])warningレベル
notice($message, array $context = [])noticeレベル
info($message, array $context = [])infoレベル
debug($message, array $context = [])debugレベル
log($level, $message, array $context = [])任意レベル

使用例:

use Apricot\Debug;
Debug::debug($this);


設定ファイル

デバッグ出力には以下の設定ファイルが存在します。

/your-project/config/setting

debugbar.setting.php
<?php
/**
 * This file contains DebugBer settings.
 */
return
[
    'debug' => env('APP_DEBUG',false),
    'renderer' => [
        'auto_assets'=>true,
        'base_url' => url('resources/debugbar'),
        'base_path' => public_dir('resources/debugbar'),
        'initialize' => true,
        'stacked_data' => true,
    ],
];

debug はデバッグ出力の有効性を指定するブール値です。この値が真の場合、デバッグ出力が有効になります。初期設定は環境変数 APP_DEBUG と同じ値です。

renderer 要素には以下の子要素があります。

auto_assets が true の場合、アプリケーションの初期化時に使用するリソースファイルを自動的に公開用ディレクトリーに作成します。auto_assets が falseの場合は、手動でリソースファイルを作成して下さい。base_urlbase_path は手動の場合に指定します。

initializestacked_dataは、デバッグ出力が有効( 'debug' => true )の場合に効果があり、通常は、true のままで使用して下さい。


アセットファイル

設定値の auto_assets がtureの場合は、アプリケーションの初期化時に自動で以下のディレクトリにのアセットファイルが作成されます。

/your-app-path/var/debugbar

auto_assets がfalseの場合は、手動で以下に場所にアセットファイルを配置するように初期設定されています。

/your-app-path/resources/debugbar

デバッグ出力で使用するアセットファイルは、以下のディレクトリーに保存されているので、この下の全てのファイルとディレクリーを上記の場所にコピーして下さい。

/your-project/vender/maximebf/debugbar/src/DebugBar/Resources/

結果的に手動の場合のアセットファイルの配置は以下のようになります:

/your-app-path/resources/debugbar

vendor/
widgets/
debugbar.css
debugbar.js
openhandler.css
openhandler.js
widgets.css
widgets.js


集約例外ハンドラー

Apricotでは例外ハンドラーとしてWhoopsを使います。コントローラで捕捉されなかった例外は、最終的にこの例外ハンドラーで捕捉するので、これは集約例外ハンドラーと呼ばれます。

集約例外ハンドラーの動作にはデバッグモードと本番モードがあります。

これらの動作をカスタマイズするには、以下のWhoopsのセットアップファイルを変更して下さい。

セットアップファイル:

/your-project/config/setup/whoops.setup.php


設定ファイル

例外ハンドラーには以下の設定ファイルが存在します。

/your-project/config/setting

whoops.setting.php
<?php
/**
 * This file contains Whoops settings.
 */
return
[
    'debug' => env('APP_DEBUG',false),
    'controller' => \App\Exceptions\UncaughtExceptionHandler::class,
    'action' => 'render',
];


集約例外コントローラ

本番モードで集約例外ハンドラーから呼び出されるコントローラを集約例外コントローラと呼びます。上述の whoops.setting.php での設定に従い、例外発生時に UncaughtExceptionHandler クラスの render() メソッドが実行されてエラーページを表示します。

初期実装されている集約例外コントローラでは、例外の種類に応じてHTTPステータスコードを以下のように設定します。

集約例外コントローラは以下に配置されています。必要に応じてカスタマイズできます。

/your-project/app/Exceptions/UncaughtExceptionHandler.php


コアの例外クラス

Exceptionを継承した2つの例外クラスがあります。

abort()

abort() 関数は HttpException をスローするボイラープレートです。通常はこの例外が発生すると集約例外コントローラが補足してエラーページを表示します。以下のように使います。

abort(400);

abort() は以下のように実装されています。

/**
 * Throws an HTTP exception.
 *
 * @param int $code
 * @param string $message
 * @throws \Apricot\Exceptions\HttpException
 */
function abort(int $code, string $message=null)
{
    throw new Apricot\Exceptions\HttpException($code, $message);
}


アプリの例外クラス

App\Exceptions\ApplicationException はアプリで発生する例外クラスのベースクラスで、Exceptionクラス から派生しています。そして、ApplicationExceptionから派生した以下のクラスがあります。


エラーバッグ

エラーバッグ( Apricot\Foundation\ErrorBag )は、入力エラーなどの業務的なエラー(例外でないエラー)の為のクラスです。

ErrorBag には名前を付けることができます( self::DEFAULT_NAME='error' )。バッグ内のエラーはキー付きの連想配列で保存されています。ErrorBagには以下のメソッドがあります。

メソッド機能
__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)エラー配列の設定

エラーバッグはIteratorAggregateインターフェースを実装してるのでforeach()などのIteratorを使用した構文が使用できます。但し、Countable インターフェイス は実装していないので、count関数ではなくErrorBag@countメソッドを使用して下さい。

バリデーションエラー用の ValidatorErrorBag クラスは、ErrorBag から派生したクラスで、'validator' という名前がついています。バリデーションエラーと他のエラーを区別するには、この名前を使用して下さい。