2012-04-15 9 views
0

silex(silex.sensiolabs.org)フレームワークに基づく私のプロジェクトで、カスタムExceptionクラスのセットを使用したいと思います。私は関数 "__construct"でエラーメッセージをログファイルに書き込むことを好みます。 MyAppクラスの__construct関数の中で$ app ['monolog']にアクセスする方法はありますか? $ appをコンストラクタパラメータとして使うか、グローバル変数として使うかは、エレガントではないと思います。あなたは本当に、あなたがあなたの例外は、サービスコンテナ(にきび)によって作成された可能性がしたい場合は

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

答えて

2

:それは強く反対お勧めする

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戻るまで呼ばれる、何も返さない場合。

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

+0

はい、私はあなたが正しいと思います..例外オブジェクトは、ロガーオブジェクトについて知る必要はありません。 エラーハンドラ関数でロガーを使用しようとします。イゴールありがとうございました! – Algis

関連する問題