在树枝模板中获取当前的url?

可能重复:
如何在Symfony 2中获得当前路线?

我四处寻找代码,以获取当前path在树枝模板(而不是完整的URL),即我不想要http://www.sitename.com/page ,我只需要/page

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

如果你想把它读入一个视图variables:

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

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

在symfony 2.1中你可以使用这个:

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

在symfony 2.0中,一个解决scheme是为此写一个树枝扩展

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

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

获取当前url:Symfony 2.3中的{{ app.request.uri }}

你可以像这样获取Twig中的当前URL:

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

应该注意的是,如果您的URL中有其他查询参数(这些参数属于configuration路由的一部分),则接受的答案将不会将其包含在当前URL(path)中。

你为什么要额外的参数?

例如,如果您的列表页面的logging可以按关键字过滤,并且页面已分页,则“关键字”和“页面”的查询variables很可能不在您的路由中。 但是在分页的前进和后退button中,您需要完整的当前URL(包含关键字,以便下一页仍然被过滤)。 你需要修改页面variables。

如何合并额外的查询参数

所以你可以得到当前的路由,并在额外的variables(修改一个或多个额外的variables后)合并。 请注意,您正在将自己的variables合并到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 }))) }}

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

如果您使用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'))