2011-06-27 97 views
11

我一直在閱讀Symfony2文檔的內部章節,它說,如果我添加一個偵聽器到kernel.controller事件我可以交換控制器運行,我有一些作品有點像這樣:試圖交換控制器與Symfony2使用事件偵聽器

public function onKernelController(FilterControllerEvent $event)  
{ 
    $controller = $event->getController(); 

    $replacementControllerName = .... //Some logic to work out the name of the new controller 
    $replacementController = ?? //Not sure what goes here 

    $event->setController($replacementController); 
} 

我不能確定,如果是我曾經工作過了更換控制器的名稱位,我怎麼得到它,我一個實例可以傳遞給setController?

回答

17

您可以設置控制器以任何調用,這意味着像

  • 靜態方法array('class', 'method')
  • 實例方法array($instance, 'method')
  • 匿名函數function() { ... }
  • 定期全局函數'function';
  • 實施__invoke()方法new MyClassImplementingInvoke()
  • 的特殊語法'class::method'迫使ControllerResolver創造class一個新實例(調用一個不帶任何參數的構造函數)的類的實例,並返回一個可調用array($instanceOfClass, 'method')

編輯:

我擡頭看錯了ControllerResolver。在標準設置下運行Symfony時,它將使用Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver(而不是Symfony\Component\HttpKernel\Controller\ControllerResolver)。所以控制器的名稱將被處理與我上面寫的有些不同。

以下示例總結了設置控制器時所具有的所有可能選項。

public function onKernelController(FilterControllerEvent $event)  
{ 
    $controller = $event->getController(); 
    // call method in Controller class in YourBundle 
    $replacementController = 'YourBundle:Controller:method'; 
    // call method in service (which is a service registered in the DIC) 
    $replacementController = 'service:method'; 
    // call method on an instance of Class (created by calling the constructor without any argument) 
    $replacementController = 'Class::method'; 
    // call method on Class statically (static method) 
    $replacementController = array('Class', 'method'); 
    // call method on $controller 
    $controller   = new YourController(1, 2, 3); 
    $replacementController = array($controller, 'method'); 
    // call __invoke on $controller 
    $replacementController = new YourController(1, 2, 3); 
    $event->setController($replacementController); 
} 
+0

感謝您的迴應,但我仍然無法正常工作,哪些選項是獲取控制器設置的最佳方式,因此Symfony會創建它? – pogo

+0

這將是選項6. –

+0

對不起,我可能是愚蠢的,但我仍然不知道如何使這項工作,你可以發佈一些示例代碼?我有點困惑,因爲我認爲class ::方法總是提到一個靜態方法,所以我看不到他們如何觸發ControllerResolver做任何事情。 – pogo

相關問題