我到处寻找用于在Twig模板中获取当前路径的代码(而不是完整URL),即http://www.sitename.com/page
,我不需要,我只需要/page
。
{{ app.request.getBaseUrl ~ app.request.getPathInfo }}
(getBaseUrl
位是可选的;仅当未安装到域的根目录时才需要)
我到处寻找用于在Twig模板中获取当前路径的代码(而不是完整URL),即http://www.sitename.com/page
,我不需要,我只需要/page
。
{{ app.request.getBaseUrl ~ app.request.getPathInfo }}
(getBaseUrl
位是可选的;仅当未安装到域的根目录时才需要)
Answers:
{{ 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
,引用您可能会在控制器使用的服务。
Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
获取当前URL:{{ app.request.uri }}
在Symfony 2.3、3、4、5中
仅获取路径:({{ app.request.pathinfo }}
不带参数)
获取请求uri:({{ app.request.requesturi }}
带参数)
{{ app.request.pathinfo }}
或查看可用的方法列表/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
uri
获取带有参数的URL。 pathinfo
获取没有参数的路径。 requestUri
获取路径与参数。 requestUri
应将此答案添加到IMO。您很少需要该域,并且很少要删除参数。
在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'}) }}
除非您想向链接中添加其他参数(例如在寻呼机中),或者想要更改其中一个参数,否则不需要所有这些。
您可以像这样在Twig中获取当前URL:
{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
请注意,如果您的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变量,因此您必须每次都包含整个内容。也许其他人有更好的解决方案。
{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
如果使用的是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'))