扩展控制器 - 但如何激活它? (Symfony 2)

时间:2013-04-06 00:12:23

标签: php symfony

我想在我的应用程序中使用此代码:

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

        //etc.

    }

}

但是我把它放在哪里以及如何激活它?我猜它与services.yml文件有关。我使用过Event Listeners,但这显然是不同的。

2 个答案:

答案 0 :(得分:2)

在您的代码段(http://justpaste.it/2caz)中,您似乎错过了对父母的调用中的“return”关键字。

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(...);
    }
}

答案 1 :(得分:0)

您可以将它放在捆绑包的Controller目录中,即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的食谱。

修改

据我所知,没有办法让这个控制器以某种方式生效。您可以按照我上面的说明对每个控制器进行扩展。

如果格式为json,您可以create an event listener并使用response event以某种方式更改响应。但是,我不确定如何从事件监听器访问视图数据。