以下面的控制器/动作为例:
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'
但这不是我需要的。
答案 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()
的方法签名不匹配。