在树枝模板中获取当前网址?

Mar*_*bor 155 symfony twig

我环顾四周寻找代码来获取Twig模板中的当前路径(而不是完整的URL),即我不想要http://www.sitename.com/page,我只需要/page.

Rod*_*olz 240

{{ path(app.request.attributes.get('_route'),
     app.request.attributes.get('_route_params')) }}
Run Code Online (Sandbox Code Playgroud)

如果要将其读入视图变量:

{% set currentPath = path(app.request.attributes.get('_route'),
                       app.request.attributes.get('_route_params')) %}
Run Code Online (Sandbox Code Playgroud)

app全局视图变量包含各种有用的快捷键,如app.sessionapp.security.token.user,引用您可能会在控制器使用的服务.

  • 不幸的是,如果你有一个带有强制参数的路由,这将不起作用. (9认同)
  • 如果您使用Twig,它也不会起作用. (4认同)

mrz*_*myr 179

获取当前网址:{{ app.request.uri }}Symfony 2.3,3,4中


获取路径:{{ app.request.pathinfo }}

  • 要获取路径,只需尝试```{{app.request.pathinfo}}``或查看```/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php中的可用方法列表``` (13认同)
  • 这应该是正确答案。短而光滑。 (3认同)
  • `uri` 获取带参数的 URL。`pathinfo` 获取带有 *NO* 参数的路径。`requestUri` 获取路径 *WITH* 参数。`requestUri` 应该添加到这个答案 IMO 中。您很少需要域,也很少想删除参数。 (2认同)

Bár*_*más 114

在symfony 2.1中,您可以使用:

{{ path(app.request.attributes.get('_route'), 
        app.request.attributes.get('_route_params')) }}
Run Code Online (Sandbox Code Playgroud)

在symfony 2.0中,一种解决方案是为此编写一个twig扩展

public function getFunctions()
{
    return array(
        'my_router_params' => new \Twig_Function_Method($this, 'routerParams'),
    );
}

/**
 * Emulating the symfony 2.1.x $request->attributes->get('_route_params') feature.
 * Code based on PagerfantaBundle's twig extension.
 */
public function routerParams()
{
    $router = $this->container->get('router');
    $request = $this->container->get('request');

    $routeName = $request->attributes->get('_route');
    $routeParams = $request->query->all();
    foreach ($router->getRouteCollection()->get($routeName)->compile()->getVariables() as $variable) {
        $routeParams[$variable] = $request->attributes->get($variable);
    }

    return $routeParams;
}
Run Code Online (Sandbox Code Playgroud)

并使用这样的

{{ path(app.request.attributes.get('_route'), my_router_params()|merge({'additional': 'value'}) }}
Run Code Online (Sandbox Code Playgroud)

除非您想要在链接中添加其他参数(例如在寻呼机中),或者您想要更改其中一个参数,否则不需要所有这些.

  • 如果您的查询字符串中有一些额外的参数,则_route_parameters将不起作用.您可以使用app.request.query.all. (12认同)
  • 如果要在Twig中生成当前链接并更改语言切换的语言环境,可以在Symfony 2.1中完成,如下所示:{{path(app.request.attributes.get('_ route'),app.request.attributes .get('_ route_params')| merge({'_ locale':'ja'}))}}如果您使用BártfaiTamás的Twig扩展名,它可能会有效 (10认同)

Zah*_*bar 33

您可以在Twig中获取当前URL,如下所示:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
Run Code Online (Sandbox Code Playgroud)


Cha*_*yer 19

应该注意的是,如果您的URL中有其他查询参数(不是已配置路由的一部分),则接受的答案将不包括在当前URL(路径)中.

你为什么想要额外的参数?

例如,如果您有一个列表页面,其中包含可以按关键字过滤的记录,并且页面具有分页,则"关键字"和"页面"的查询变量很可能不在您的路径中.但是在用于分页的前进和后退按钮中,您需要完整的当前URL(包含关键字,以便仍然过滤下一页).您需要修改页面变量.

如何合并额外的查询参数

因此,您可以获取当前路径,并合并其他变量(在修改一个或多个额外变量之后).请注意,您正在将自己的变量合并到app.request.query.all,然后将该数组合并到app.request.attributes.get('_route_params').该path()方法要求您提供路由的所有必需参数,这就是您需要包含该参数的原因_route_params.

{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge(app.request.query.all|merge({'page': 2 }))) }}

这真的很难看,但是如果你正在开发分页,你需要在每个单独的链接上修改页面变量,所以你必须每次都包含整个内容.也许其他人有更好的解决方案.

  • 可能应该是{{path(app.request.attributes.get('_ route'),app.request.query.all | merge(app.request.attributes.get('_ route_params'))}}}` (2认同)