没有适用于所有用例的解决方案 . 如果您使用$ request-> get('_route')方法或其变体, it will return '_internal' 用于发生转发的情况 .
如果您需要一个甚至可以转发的解决方案,您必须使用到达2.4的新RequestStack服务,但 this will break ESI support :
$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
echo $masterRequest->attributes->get('_route');
}
<?php
$request = $this->container->get('router.request_context');
//Assuming you are on user registration page like https://www.yoursite.com/user/registration
$scheme = $request->getScheme(); //This will return https
$host = $request->getHost(); // This will return www.yoursite.com
$route = $request->getPathInfo(); // This will return user/registration(don't forget this is registrationAction in userController
?>
12 回答
从ContainerAware(像控制器)的东西:
随着Twig:
{{ app.request.attributes.get('_route') }}
我认为这是最简单的方法:
Symfony 2.0-2.1
用这个:
那个人不会给你
_internal
.Update for Symfony 2.2+: 这无法启动Symfony 2.2 . 我打开bug,答案是"by design" . 如果您希望在子操作中获取路径,则必须将其作为参数传递
而你的控制器:
没有适用于所有用例的解决方案 . 如果您使用$ request-> get('_route')方法或其变体, it will return '_internal' 用于发生转发的情况 .
如果您需要一个甚至可以转发的解决方案,您必须使用到达2.4的新RequestStack服务,但 this will break ESI support :
如果您需要在模板中使用它,可以使用此扩展枝条 .
_route is not the way to go and never was . 根据创建Symfony的Fabien的说法It was always meant for debugging purposes . 它是不可靠的,因为它不能用于转发和其他直接调用控制器之类的东西,如部分渲染 .
您需要在控制器中注入路径名称作为参数,see the doc here
此外,如果您不需要灵活性,请不要使用
$request->get('');
,这比使用您需要的特定属性包(属性,查询或请求)慢得多,因此在这种情况下$request->attributes->get('_route');
.您可以从控制器中的请求对象中获取路径名称 .
我从中得到的只是
_internal
我从控制器内部获取路径名称
$this->getRequest()->get('_route').
甚至代码tuxedo25建议返回_internal
这段代码在Symfony 1.X中被称为'Component'中执行;不是页面的控制器,而是需要一些逻辑的页面的一部分 .
Symfony 1.X中的等效代码是:
sfContext::getInstance()->getRouting()->getCurrentRouteName();
使用Symfony 3.3,我使用了这种方法并且工作正常 .
我有4条路线
只有一行为所有路线创建一个活动类 .
要根据URL获取当前路由(在转发时更可靠):
对于任何需要Symfony 3当前路线的人来说,这就是我使用的
如果你想获得控制器中的路由名称而不是必须注入请求(而不是从Symfony UPGRADE获取容器,而不是调用get('_route') .
如果你想在树枝上获得路线名称,那么你必须得到它