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

如果一个错误处理程序没有返回任何东西,其他错误处理程序将被调用,直到一个返回。

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

于 2012-04-15T11:23:22.623 回答