Symfony2控制器和模板表达式是否可以相对于bundle写入?

时间:2011-12-06 05:01:04

标签: php symfony bundle

以下面的控制器/动作为例:

public function indexAction()
{   
    return $this->render('TestBundle:TestController:index.html.twig');
}

我想用这种方式编写模板表达式(或其名称):

public function indexAction()
{   
    return $this->render('*:TestController:index.html.twig');
}

因此symfony知道我正在寻找这个非常捆绑的模板。必须为我想要引用的每个模板/操作/存储库编写整个Owner + Bundle非常烦人。更重要的是,考虑到大部分时间我都会在同一个包中引用操作和模板。

注意:我知道模板可以放在应用程序级别,并且可以像这样引用:

'::index.html.twig'

但这不是我需要的。

1 个答案:

答案 0 :(得分:0)

可以使用一些自定义代码。

基本上,您希望覆盖控制器的render()方法并包含用于获取当前包名称的逻辑。

请注意,不是我的控制器扩展Symfony\Bundle\FrameworkBundle\Controller\Controller,而是扩展自定义控制器(然后扩展Symfony的控制器)。这允许您通过添加自己的方法为控制器提供更多的能力。

例: MyBundle\Controller\MyController\扩展MyCustomBaseController,扩展Symfony\Bundle\FrameworkBundle\Controller\Controller

因此,在我的自定义控制器中,我有以下两种方法:

public function render($view, array $parameters = array(), Response $response = null) {
    $currentBundle = $this->getCurrentBundle();
    $view = str_replace('*', $currentBundle, $view);
    return parent::render($view, $parameters, $response);
}

public function getCurrentBundle() {
    $controller = $this->getRequest()->attributes->get('_controller');
    $splitController = explode('\\', $controller);
    return $splitController[1];
}

看看render()。它获取当前包名称并使用它来构建$view变量。然后它只调用parent::render(),就像你在render语句中手动定义了bundle名一样。

此处的代码非常简单,因此您应该能够轻松扩展它以执行其他操作,例如允许您也避免键入控制器名称。

重要提示:如果您使用自定义控制器,请确保use Symfony\Component\HttpFoundation\Response,否则PHP会抱怨render()的方法签名不匹配。