Symfony2 app.request.get在渲染的树枝模板中返回null

时间:2016-11-24 21:01:37

标签: php symfony twig

我通过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的路由和参数?

2 个答案:

答案 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'),
    ]);
}