Php Symfony2 app.request.get在呈现的细枝模板中返回null

Php Symfony2 app.request.get在呈现的细枝模板中返回null,php,symfony,twig,Php,Symfony,Twig,我通过render函数从base.twig文件渲染header.twig。因此,在my base.twig中,有以下代码触发header controller: {{ render(controller('MyBundle:Global:header')) }} 该控制器渲染header.twig。在此细枝文件中,有以下用于更改语言的代码链接: <a href="{{ path(app.request.get('_route'), app.request.get('_route_para

我通过render函数从base.twig文件渲染header.twig。因此,在my base.twig中,有以下代码触发header controller:

{{ render(controller('MyBundle:Global:header')) }}
该控制器渲染header.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>

如果我直接在base.twig中运行相同的代码链接,请求将返回正确的对象。看起来是因为header.twig有自己的控制器,所以请求不起作用。是否可以以其他方式请求活动url的路由和参数SR?

controller
方法采用两个可选参数。

不是100%确定,但这可能会起作用:

{{ render(controller('MyBundle:Global:header',
  {
    '_route': app.request.get('_route'),
    '_route_params': app.request.get('_route_params')
  }
)) }}

controller
方法接受两个可选参数。

不是100%确定,但这可能会起作用:

{{ render(controller('MyBundle:Global:header',
  {
    '_route': app.request.get('_route'),
    '_route_params': app.request.get('_route_params')
  }
)) }}

在@Gustek的回答中添加了这一点,因为我在第一个案例中忽略了实际问题

实际上,您正在呈现子请求,因此
\u route
\u route\u params
来自子请求,而不是主请求。当您使用控制器时,最干净的方法是从主请求获取参数,并在控制器调用中作为参数传递这些参数。您可以通过render调用将它们传递进来(正如@Gustek所回答的),但这意味着您希望在每次调用中都这样做,或者您可以将请求堆栈传递到twig会话中,但这将是不必要的额外工作

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

在@Gustek的回答中添加了这一点,因为我在第一个案例中忽略了实际问题

实际上,您正在呈现子请求,因此
\u route
\u route\u params
来自子请求,而不是主请求。当您使用控制器时,最干净的方法是从主请求获取参数,并在控制器调用中作为参数传递这些参数。您可以通过render调用将它们传递进来(正如@Gustek所回答的),但这意味着您希望在每次调用中都这样做,或者您可以将请求堆栈传递到twig会话中,但这将是不必要的额外工作

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

使用
app.request.get(''u route_params',{})
,这样如果没有
\u route_params
,它将默认为一个emty对象。这有助于删除错误,但我只需要这些值,因为这些值应该在应用程序中可用。这些是标准路由url和url中的参数。使用
app.request.get(“'u route\u params',{})
,这样,如果没有
\u route\u params
,它将默认为一个emty对象。这有助于消除错误,但我需要这些值,因为这些值应该在应用程序中可用。这些是标准路由url和url中的参数。