我试图覆盖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(但是;-),我在这方面做了一些事情,但似乎我在途中遗漏了一些东西......
答案 0 :(得分:0)
好的我发现:在基类Monolog \ Handler \ BrowserConsoleHandler中,它来自方法链的调用方式,在我的例子中,generateScript()
由send()
调用,在我身上已将self::generateScript
更改为static::generateScript.
但这还不够,发送()由
register_shutdown_function(array('Monolog\Handler\BrowserConsoleHandler', 'send'));
所以类上下文是基础上下文,我们必须将类名更改为get_called_class()
然后上下文是我的子类,最后我必须在基类中修改所有private
到protected
,我认为如果要继承基本静态类,它应该像这样才能正常工作。所以它取决于Monolog团队,我会注意到它们。