2012-04-15 52 views
0

我想在基於silex(silex.sensiolabs.org)框架的項目中使用一組自定義Exception類。我更喜歡在函數「__construct」中將錯誤消息寫入日誌文件。有沒有辦法在MyException類的__construct函數中訪問$ app ['monolog']? 我想什麼使用$應用程序作爲構造函數參數或作爲全局變量不是優雅的方式。

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); 
    } 
}); 

如果錯誤處理程序不返回任何東西,其他的錯誤處理程序將被調用,直到有回報。

注:如果你不知道,獨白服務提供商已經記錄的所有異常。

+0

是的,我想你是對的。該異常對象並不需要知道關於記錄器對象。 我會嘗試在錯誤處理函數中使用記錄器,就像你說的那樣。非常感謝,伊戈爾! – Algis 2012-04-15 13:10:11

相關問題