我使用twig渲染,在部分控制器中我想获得主控制器名称,但是
$this->get('request')->get('_template')->get('controller')
返回partial
。
如何在部分控制器中获取主要请求对象?
现在我用:
{% render 'FooBundle::Controller:action' with {'controller': getControllerName() } %}
使用自定义Twig功能。 也许有更优雅的方法来做到这一点?
答案 0 :(得分:2)
您可能需要的是include
标记,其中包含另一个模板。
{% include 'FooBundle::partial.html.twig' %}
模板包含适用于简单的情况,您只需要部分内容。
render
标记用于调用控制器,执行更复杂的操作,或者模板无法访问显示所需的变量。这样做,内核会创建一个新请求,就好像它是一个独立的请求一样。事实上,使用ESI可能是对该控制器的独立请求。See here for details。因此,您无法获取主请求对象,可能没有主请求对象,因为您使用ESI或因为您为该控制器创建路由并通过AJAX或其他任何方式调用它。正如我所知,框架不支持依赖于通过子请求调用控制器的信息,我认为这是故意的。您必须传递查询参数中的所有信息。
你的例子不正确,就像这样:
{% render 'FooBundle:MyController:actionName' ... %}
你必须有一个FooBundle\Controller\MyControllerController
这样的课程才能工作。
namespace FooBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class MyControllerController extends Controller {
public function actionNameAction() {
...
}
}
答案 1 :(得分:2)
您需要在render标记中显式传递此值。
{% render 'AcmeBundle:Demo:something' with { 'via': app.request.attributes.get('_controller') } %}