覆盖Monolog处理程序

时间:2014-04-28 14:55:49

标签: php symfony

我试图覆盖Monolog处理程序BrowserConsoleHandler来自定义一些操作,但我的自定义静态方法显然没有被调用。 我认为对于静态类,继承的类应该使用static ::而不是self ::来调用down类方法,但是即使临时修改基类:我的子方法没有被调用,超级方法被调用。

我创建了自定义处理程序

namespace MyBundle\Monolog;
use Monolog\Handler\BrowserConsoleHandler as BaseBrowserConsoleHandler;
class BrowserConsoleHandler extends BaseBrowserConsoleHandler {
    public static function generateScript(){
          // my custom operation that is not called :[
    }
...

然后我将自定义处理程序添加为config.yml

中的服务
services:
    browser_console_logger:
        class: Symfony\Bridge\Monolog\Logger
        arguments: [special]
        calls:
            - [pushHandler, [@browser_console_handler]]
    browser_console_handler:
        class: MyBundle\Monolog\BrowserConsoleHandler

然后我使用我的记录器:

    $logger = $this->get('browser_console_logger');
    $logger->info('hello console : ', [
        'foo' => 'bar'
    ]);

我在浏览器控制台中获取了我的日志,但我的子方法尚未被调用... 我在开发环境中,我的缓存很清楚。 我没有尝试过symfony(但是;-),我在这方面做了一些事情,但似乎我在途中遗漏了一些东西......

1 个答案:

答案 0 :(得分:0)

好的我发现:在基类Monolog \ Handler \ BrowserConsoleHandler中,它来自方法链的调用方式,在我的例子中,generateScript()send()调用,在我身上已将self::generateScript更改为static::generateScript. 但这还不够,发送()由

调用
register_shutdown_function(array('Monolog\Handler\BrowserConsoleHandler', 'send'));

所以类上下文是基础上下文,我们必须将类名更改为get_called_class() 然后上下文是我的子类,最后我必须在基类中修改所有privateprotected,我认为如果要继承基本静态类,它应该像这样才能正常工作。所以它取决于Monolog团队,我会注意到它们。