0

プロジェクトで、silex(silex.sensiolabs.org)フレームワークに基づくカスタム例外クラスのセットを使用したいと思います。関数「__construct」のログファイルにエラーメッセージを書き込むことを好みます。MyExceptionクラスの__construct関数内の$app['monolog']にアクセスする方法はありますか?$ appをコンストラクターパラメーターとして、またはグローバル変数として使用する方法は、洗練された方法ではないと思います。

class MyException extends Exception
{
    public function __construct($message = '')
    {
        parent::__construct($message);
        //how to do?
        $app['monolog']->addError($message);
    }
}
4

1 に答える 1

2

本当に必要な場合は、サービスコンテナ(Pimple)によって例外を作成することができます。

class MyException extends Exception
{
    public function __construct($message = '', $monolog)
    {
        parent::__construct($message);
        $monolog->addError($message);
    }
}

// no share() => create new instance every time
$app['my_exception'] = function ($app) {
    return new MyException($app['monolog']);
};

これに反対することを強くお勧めします。例外をロギングロジックに結合したくない場合です。より良いアプローチは、それをログに記録するエラーハンドラーを追加することです。

例:

$app->get('/error', function () {
    throw new MyException('A totally expected error happened.');
});

$app->error(function ($e) use ($app) {
    if ($e instanceof MyException) {
        $app['monolog']->addError($message);
    }
});

エラーハンドラが何も返さない場合、他のエラーハンドラは1つが戻るまで呼び出されます。

注:知らなかった場合、monologサービスプロバイダーはすでにすべての例外をログに記録しています。

于 2012-04-15T11:23:22.623 に答える