2013-04-06 43 views
0

我想在我的應用程序使用此代碼:擴展控制器 - 但如何激活它? (Symfony的2)

class ControllerExtension extends Symfony\Bundle\FrameworkBundle\Controller\Controller 
{ 
    public function render($view, array $parameters = array(), Response $response = null) 
    { 

     //etc. 

    } 

} 

但我在哪裏把它和如何激活呢?我猜這是與services.yml文件有關。我使用過事件監聽器,但這顯然不同。

回答

0

你可以把它放在你的軟件包的控制器目錄中,例如src/YourNamespace/YourBundleName/Controller/ControllerExtension.php。 確保您在該文件中提供了相應的命名空間:

namespace YourNamespace\YourBundleName\Controller; 
class ControllerExtension extends Symfony\Bundle\FrameworkBundle\Controller\Controller 
{ 
... 

要使用它,您既可以在src/YourNamespace/YourBundlename/Resources/config/routing.yml

它的路由擴展它:

namespace YourNamespace\YourBundleName\Controller; 
class OtherController extends ControllerExtension 
{ 
... 

如果你實際想要做的是重寫另一個包的控制器,請參閱描述overriding controllers的食譜。

編輯

據我所知,有沒有辦法自動使該控制器在某種程度上生效。如上所述,您可以讓每個控制器擴展它。

您可能能夠create an event listener並使用response event以某種方式更改響應,如果格式爲json。但是,我不確定你將如何從事件監聽器訪問視圖數據。

+0

嗨,謝謝,但我仍然努力讓這個工作。基本上我只想覆蓋項目中的'每一個'控制器。它只會執行一個小動作。就像我已經在每個請求上運行的services.yml中激活了一個請求偵聽器,我希望它可以在每個請求上運行,但是我無法運行它。 – user2143356 2013-04-06 01:17:38

+0

您可能想更新您的問題,更具體地說......您想要在每個請求上運行什麼。可能比控制器類更容易。 – 2013-04-06 01:28:30

+0

這樣的事情:http://justpaste.it/2caz - 我只是不能讓代碼運行(挑選課程) – user2143356 2013-04-06 02:20:11

2

從您的代碼片段(http://justpaste.it/2caz),似乎您在調用父項時錯過了「返回」關鍵字。

class ControllerExtension extends Symfony\Bundle\FrameworkBundle\Controller\Controller 
{ 
    public function render($view, array $parameters = array(), Response $response = null) 
    { 
     if($this->getRequest()->getRequestFormat() == 'json') { 
      return new Response(json_encode($parameters)); 
     } else { 
      // Missing 'return' in your snippet 
      return parent::render($view, $parameters, $response); 
     } 
    } 

} 

class MyController extends ControllerExtension 
{ 
    public function indexAction() 
    { 
     // This should now work 
     return $this->render(...); 
    } 
}