【问题标题】:Get access to silex $app in custom Exception constructor?在自定义异常构造函数中访问 silex $app?
【发布时间】:2012-04-15 06:17:25
【问题描述】:

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

【问题讨论】:

    标签: php silex monolog


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,我认为你是对的。异常对象不需要知道记录器对象。正如你所说,我将尝试在错误处理函数中使用记录器。非常感谢你,伊戈尔!
    猜你喜欢
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多