如何在Symfony 2获得当前路线?

Ily*_*hin 216 php routing symfony symfony-routing

如何在Symfony 2中获取当前路线?

例如,routing.yml:

somePage:
   pattern: /page/
   defaults: { _controller: "AcmeBundle:Test:index" }
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得这个somePage价值?

小智 313

从ContainerAware(像控制器)的东西:

$request = $this->container->get('request');
$routeName = $request->get('_route');
Run Code Online (Sandbox Code Playgroud)

  • github.com/symfony/symfony/issues/854 request.attributes.get('_ route')不可靠,因为它仅用于调试目的(symfony dev表示),如果转发请求则不起作用...请参阅超新星的回答记录在案并且更加自动防故障 (35认同)
  • 转发某些内容时无法正常工作的原因是您直接转发到控制器,而不是路由.因此,Symfony不知道是什么路线.通常,您有一个路由到一个控制器,因此除了"_internal"之外,它不能报告任何内容可能看起来很奇怪,但是,可以创建与多个路由定义相关联的通用控制器.当你考虑所有这些时,我认为这个"问题"更有意义. (3认同)
  • @得到了一个 switchwation 你检查 http://meta.stackexchange.com/questions/155258/i-found-answers-for-a-question-not-really-correct-what-i-should-do (2认同)
  • $ request-> get('_ route'); 是缓慢的 !$ request-> attributes-> get('_ route'); 如果您不需要灵活性会更好 (2认同)
  • 从 Symfony 4.3 开始,这是官方记录的获取当前路由名称的方法:https://symfony.com/doc/4.3/routing.html#getting-the-route-name-and-parameters (2认同)

Mat*_*ieu 189

用树枝: {{ app.request.attributes.get('_route') }}

  • github.com/symfony/symfony/issues/854 request.attributes.get('_ route')不可靠,因为它仅用于调试目的(symfony dev表示),如果转发请求则不起作用...请参阅超新星的回答记录在案并且更加自动防故障 (10认同)
  • 谢谢!使用`<body class ="{{app.request.get('_ route')| replace({'_':' - '})}}">`来应用页面特定的css :) (8认同)

小智 47

我认为这是最简单的方法:

class MyController extends Controller
{
    public function myAction($_route)
    {
        var_dump($_route);
    }

    .....
Run Code Online (Sandbox Code Playgroud)

  • @charlie http://symfony.com/doc/master/book/routing.html#route-parameters-and-controller-arguments (7认同)
  • 您可以添加更多解释或显示示例输出,以阐明这是如何解决问题的吗? (3认同)
  • 这绝对是原始问题的最佳答案.作为旁注:然而,对于像`{%render"SomeBundle:SomeController:someAction"%}`这样的子请求,它不起作用,你将再次获得值'_internal'. (2认同)
  • 遗憾的是,这只适用于原始的Action,因为它必须转发任何其他功能. (2认同)

jsg*_*pil 27

Symfony 2.0-2.1
使用此:

    $router = $this->get("router");
    $route = $router->match($this->getRequest()->getPathInfo());
    var_dump($route['_route']);
Run Code Online (Sandbox Code Playgroud)

那个人不会给你_internal.

更新Symfony 2.2+:这不适用于启动Symfony 2.2+.我打开了一个错误,答案是"按设计".如果您希望在子操作中获取路径,则必须将其作为参数传递

{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}
Run Code Online (Sandbox Code Playgroud)

而你的控制器:

public function menuAction($route) { ... }
Run Code Online (Sandbox Code Playgroud)


K. *_*ert 19

没有适用于所有用例的解决方案.如果您使用$ request-> get('_ route')方法或其变体,对于发生转发的情况,它将返回'_internal'.

如果您需要一个甚至可以转发的解决方案,您必须使用到达2.4的新RequestStack服务,但这将打破ESI支持:

$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
    echo $masterRequest->attributes->get('_route');
}
Run Code Online (Sandbox Code Playgroud)

如果您需要在模板中使用它,可以使用此扩展枝条.


Tom*_*oms 11

_route不是要走的路,也不是.根据创建Symfony的Fabien,它总是用于调试目的.它是不可靠的,因为它不能用于转发和其他直接调用控制器之类的东西,如部分渲染.

您需要在控制器中注入路径名称作为参数,请参阅此处的文档

另外,$request->get('');如果你不需要灵活性,请不要使用它比使用你需要的特定属性包(属性,查询或请求)慢得多,所以$request->attributes->get('_route');在这种情况下.

  • 好的,你基本上建议在这个文件中的每个路由添加额外的信息,而不是获取路由名称?......这种思考和回应人们挣扎的方式是越来越多人讨厌symfony的原因之一. (4认同)
  • 文档链接已损坏。然而,symfony 5.3 版本的相应页面实际上指出获取 `_route` 是正确的方法,实际上:https://symfony.com/doc/5.3/routing.html#getting-the-route-name-与参数 (2认同)

Ven*_*tra 7

$request->attributes->get('_route');
Run Code Online (Sandbox Code Playgroud)

您可以从控制器中的请求对象中获取路径名称.