2012-04-15 5 views
0

Ich möchte eine Reihe von benutzerdefinierten Exception-Klassen in meinem Projekt basierend auf Silex (Silex.sensiolabs.org) Framework verwenden. Ich schreibe lieber eine Fehlermeldung in die Protokolldatei in der Funktion "__construct". Gibt es eine Möglichkeit, innerhalb der __construct-Funktion der MyException-Klasse auf $ app ['monolog'] zuzugreifen? Ich denke, was eine $ app als Konstruktor Parameter oder als globale Variable ist nicht elegant Weg.

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

Antwort

2

Wenn Sie wirklich, Sie wollten Ihre Ausnahmen von der Dienstcontainer (Pimple) erstellt haben könnte:

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

Es wäre gegen diese dringend raten, möchten Sie nicht zu koppeln Ihre Ausnahmen zur Protokollierungslogik. Ein viel besserer Ansatz wäre, einen Fehlerhandler hinzuzufügen, der ihn protokolliert.

Beispiel:

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

Wenn ein Fehler-Handler nicht alles zurückgeben, die anderen Fehler-Handler wird, bis eine Rückkehr aufgerufen werden.

Hinweis: Falls Sie es nicht wussten, protokolliert der Monolog-Dienstanbieter bereits alle Ausnahmen.

+0

Ja, ich denke, Sie haben Recht .. Das Ausnahmeobjekt muss nicht über Logger-Objekt bekannt sein. Ich werde versuchen, den Logger in Fehlerhandler-Funktion zu verwenden, wie Sie sagen. Vielen Dank, Igor! – Algis

Verwandte Themen