2014-04-28 57 views
1

我想覆蓋Monolog處理程序BrowserConsoleHandler來自定義一些操作,但我的自定義靜態方法顯然不被調用。 我紅色的靜態類,繼承類應使用靜態::相反自我::調用類方法,但即使通過臨時修改基類:我的子方法沒有被調用,超級方法被調用。重寫單引號處理程序

我創建了自定義的處理器

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' 
    ]); 

我讓我的日誌在瀏覽器控制檯,但我的子方法尚未被稱爲... 我在德v env和我的緩存清楚。 我不是很symfony(還;-)的實驗,我在這個紅色的一些東西,但它似乎我缺少的東西上的方式...

回答

0

好的我發現:在基類Monolog \ Handler \ BrowserConsoleHandler,它來自於方法鏈的調用方式,並在我的情況,generateScript()send(),whitch在我改變self::generateScriptstatic::generateScript. 但這是不夠的,送(稱呼)是由

register_shutdown_function(array('Monolog\Handler\BrowserConsoleHandler', 'send')); 
稱爲

所以類的上下文是基礎的,我們必須將類名更改爲get_called_class() 然後上下文是我的子類,最後我必須在基類中修改所有privateprotected,我認爲如果基本靜態類是要繼承的,它應該是這樣工作的。所以它依賴於Monolog團隊,我會注意到他們。