我通过render函数从base.twig文件渲染header.twig。所以在我的base.twig中有以下代码来触发头控制器:
{{ render(controller('MyBundle:Global:header')) }}
该控制器呈现header.twig。在这个twig文件中,有以下代码链接用于更改语言:
<a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale' : app.request.locale })) }}"><img src="{{ asset('flags/'~app.request.locale~'.png', 'img') }}" /></a>
app.request.get('_ route')和app.request.get('_ route_params')形成的对象都返回null。
app.request.get('_route')
如果我直接在base.twig中运行相同的代码链接,请求将返回正确的对象。看起来因为header.twig有自己的控制器,请求不起作用。是否可以以其他方式请求活动URL的路由和参数?
答案 0 :(得分:2)
controller
方法有2个可选参数。
http://symfony.com/doc/current/reference/twig_reference.html#controller
不是100%肯定它,但也许这会奏效:
{{ render(controller('MyBundle:Global:header',
{
'_route': app.request.get('_route'),
'_route_params': app.request.get('_route_params')
}
)) }}
答案 1 :(得分:2)
添加@ Gustek的答案,因为我在第一种情况下错过了实际问题。
您实际上是在渲染子请求,因此_route
和_route_params
来自子请求而不是主请求。当您使用控制器时,最干净的方法是从主请求中获取参数,并将这些参数作为控制器调用中的参数传递。您可以通过渲染调用传递它们(正如@Gustek已经回答的那样),但这意味着您将意味着每次调用都要执行它,或者您可以将请求堆栈传递到twig会话中,但这将是不必要的额外工作。 / p>
public function headerAction(Request $request)
{
$masterRequest = $this->container->get('request_stack')->getMasterRequest();
//...
return $this->render('MyBundle:Global:header.html.twig', [
//...
'_route' => $masterRequest->attributes->get('_route'),
'_route_params' => $masterRequest->attributes->get('_route_params'),
]);
}