在自定义Exception构造函数中访问silex $ app?

时间:2012-04-15 06:17:25

标签: php silex monolog

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

1 个答案:

答案 0 :(得分: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);
    }
});

如果错误处理程序没有返回任何内容,则会调用其他错误处理程序,直到返回。

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