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

时间:2012-02-21 13:49:28

标签: symfony twig

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

7 个答案:

答案 0 :(得分:225)

{{ path(app.request.attributes.get('_route'),
     app.request.attributes.get('_route_params')) }}

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

{% set currentPath = path(app.request.attributes.get('_route'),
                       app.request.attributes.get('_route_params')) %}

app全局视图变量包含各种有用的快捷方式,例如app.sessionapp.security.token.user,它们引用您可能在控制器中使用的服务。

答案 1 :(得分:169)

Symfony 2.3,3,4

获取当前网址{{ app.request.uri }}

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

答案 2 :(得分:114)

在symfony 2.1中,您可以使用:

{{ path(app.request.attributes.get('_route'), 
        app.request.attributes.get('_route_params')) }}

在symfony 2.0中,一种解决方案是为此

编写一个枝条扩展名
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;
}

并像这样使用

{{ path(app.request.attributes.get('_route'), my_router_params()|merge({'additional': 'value'}) }}

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

答案 3 :(得分:32)

您可以像这样在Twig中获取当前网址:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}

答案 4 :(得分:18)

应该注意的是,如果您的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 }))) }}

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

答案 5 :(得分:1)

如果您使用的是Silex 2,则无法再访问Request对象。

您可以通过这种方式访问​​当前的请求属性。

app.request_stack.currentrequest.attributes.get('_route')

并生成完整的当前网址: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))

答案 6 :(得分:0)

使用 Symfony 5 你可以使用这个:

{{ app.request.uri }}