在自定义异常构造函数中访问 silex $app


Get access to silex $app in custom Exception constructor?

我想在我的项目中使用一组基于 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);
    }
}

如果你真的想,你可以让服务容器(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);
    }
});

如果错误处理程序未返回任何内容,则将调用其他错误处理程序,直到一个错误处理程序返回。

注意:如果您不知道,monolog 服务提供商已经记录了所有异常。