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


169

我到处寻找用于在Twig模板中获取当前路径的代码(而不是完整URL),即http://www.sitename.com/page,我不需要,我只需要/page


11
这不是精确的重复项,因为答案2包含链接问题未提供的必要信息(关于请求参数)。应该将答案2合并到链接的问题中。
Victor Sergienko 2012年

1
尝试app.request.requestUri。
克里斯托夫Dombi

7
根本不是骗子。投票重新开放。发布我的答案作为评论,因为我现在不允许回答... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}getBaseUrl位是可选的;仅当未安装到域的根目录时才需要)
mpen

Answers:


250
{{ 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,引用您可能会在控制器使用的服务。


9
不幸的是,如果您的路由带有必选参数,则此操作将无效。
MartinSchuhfuß2012年

如果使用不带Symfony的Twig,则可以执行以下操作:$ twig-> addGlobal(“ CurrentUrl”,$ _SERVER [“ REQUEST_URI”]);
GateKiller 2012年

1
如果您的路线具有必填参数,请参见以下答案
山姆

@GateKiller这使我的功能测试失败:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
罗宾(Robin)

感谢您的精彩回答,非常有帮助!
Vahe Shadunts,2015年

199

获取当前URL{{ app.request.uri }}Symfony 2.3、3、4、5中


获取路径:({{ app.request.pathinfo }}不带参数)


获取请求uri:({{ app.request.requesturi }}带参数)


1
这是唯一为我工作的人。所有其他查询都错过了不是路由一部分或依赖于控制器而不是Twig的查询参数。
克雷格

13
为了获取路径只能尝试{{ app.request.pathinfo }}或查看可用的方法列表/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
迈克尔

2
这应该是正确的答案。短而流畅。
Fabian Picone

2
uri获取带有参数的URL。 pathinfo获取没有参数的路径。 requestUri获取路径参数。 requestUri应将此答案添加到IMO。您很少需要该域,并且很少要删除参数。
rybo111

115

在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'}) }}

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


11
如果要在Twig中生成当前链接并更改语言切换的语言环境,则可以在Symfony 2.1中按以下步骤完成:{{path(app.request.attributes.get('_ route'),app.request.attributes .get('_ route_params')| merge({'_ locale':'ja'}))}}如果您使用BártfaiTamás的Twig扩展名-Naytzyrhc
2012年

对于您的2.0实施,我收到一条错误消息,说没有容器。所以我像在PagerfantaBundle中一样添加了变量,但是随后它说我必须实现ContainerInterface?
Squazic 2012年

您必须为此扩展创建一个构造函数,该构造函数具有$ container参数。然后,在DIC配置中,必须将容器声明为扩展的参数。喜欢这里的TwigBundle
Bártfai陶

12
如果查询字符串中还有一些其他参数,则_route_parameters将不起作用。您可以改用app.request.query.all。
wdev 2012年

34

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

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

20

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

这确实很丑陋,但是如果您正在开发分页,则需要在每个单独的链接上修改page变量,因此您必须每次都包含整个内容。也许其他人有更好的解决方案。


2
可能应该是{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk

2

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

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

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

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


您可以像这样在Twig / Silex 2中获取当前URL :global.request.attributes.get('_route')。需要小枝桥
dsoms
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.