我试图重写Monolog处理程序BrowserConsoleHandler来自定义一些操作,但是我的自定义静态方法显然没有被调用。对于静态类,继承的类应该使用静态::代替self:来调用类方法,但是即使临时修改基类:我的子方法没有被调用,超级方法也会被调用。
我创建了我的自定义处理程序
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'
]);我在浏览器控制台中获得日志,但我的sub尚未被调用.我在dev env中,我的缓存是清楚的。我还没有很好地试验过symfony (还没有;-),我在这上面做了几件事,但似乎我在路上遗漏了什么。
发布于 2014-04-29 10:22:04
好的,我发现:在基类Monolog\Handler\BrowserConsoleHandler中,它来自调用方法链的方式,而在我的例子中,generateScript()是由send()调用的,在我的例子中,send()将self::generateScript更改为static::generateScript.,但这还不够,send()是由
register_shutdown_function(array('Monolog\Handler\BrowserConsoleHandler', 'send'));因此,类上下文是基本上下文,我们必须将类名更改为get_called_class(),然后上下文是我的子类,最后我必须在基类中将所有private修改为protected,我认为如果要继承基类静态类,则应该像这样正确地工作。所以这是独立的团队,我会注意到他们的。
https://stackoverflow.com/questions/23344364
复制相似问题