我四处寻找代码来获取Twig模板中的当前路径(而不是完整的URL),即我不想 http://www.sitename.com/page ,我只需要 /page .
http://www.sitename.com/page
/page
{{ 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.session 和 app.security.token.user ,它们引用您可能在控制器中使用的服务 .
app
app.session
app.security.token.user
获取 current url : {{ app.request.uri }} in Symfony 2.3, 3, 4
{{ app.request.uri }}
获取 path only : {{ app.request.pathinfo }}
{{ app.request.pathinfo }}
在symfony 2.1中,您可以使用:
在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; }
并使用这样的
{{ path(app.request.attributes.get('_route'), my_router_params()|merge({'additional': 'value'}) }}
除非您想要在链接中添加其他参数(例如在寻呼机中),或者您想要更改其中一个参数,否则不需要所有这些 .
您可以在Twig中获取当前URL,如下所示:
{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
应该注意的是,如果您的URL中有其他查询参数,这些参数是配置路由的一部分,则接受的答案将不包括在当前URL(路径)中 .
例如,如果您有一个列表页面,其中包含可以按关键字过滤的记录,并且页面具有分页,则“关键字”和“页面”的查询变量很可能不在您的路径中 . 但是在用于分页的前进和后退按钮中,您需要完整的当前URL(包含关键字,以便仍然过滤下一页) . 您需要修改页面变量 .
因此,您可以获取当前路径,并合并其他变量(在修改一个或多个额外变量之后) . 请注意,您正在将自己的变量合并到 app.request.query.all ,然后将该数组合并到 app.request.attributes.get('_route_params') 中 . path() 方法要求您提供路径的所有必需参数,这就是您需要包含 _route_params 的原因 .
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 }))) }}
这真的很难看,但是如果你正在开发分页,你需要在每个单独的链接上修改页面变量,所以你必须每次都包含整个内容 . 也许其他人有更好的解决方案 .
如果您使用的是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'))
path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))
6 回答
如果要将其读入视图变量:
app
全局视图变量包含各种有用的快捷方式,例如app.session
和app.security.token.user
,它们引用您可能在控制器中使用的服务 .获取 current url :
{{ app.request.uri }}
in Symfony 2.3, 3, 4获取 path only :
{{ app.request.pathinfo }}
在symfony 2.1中,您可以使用:
在symfony 2.0中,一种解决方案是为此编写一个twig扩展
并使用这样的
除非您想要在链接中添加其他参数(例如在寻呼机中),或者您想要更改其中一个参数,否则不需要所有这些 .
您可以在Twig中获取当前URL,如下所示:
应该注意的是,如果您的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 }))) }}
这真的很难看,但是如果你正在开发分页,你需要在每个单独的链接上修改页面变量,所以你必须每次都包含整个内容 . 也许其他人有更好的解决方案 .
如果您使用的是Silex 2,则无法再访问Request对象 .
您可以通过这种方式访问当前请求属性 .
并生成完整的当前URL:
path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))