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

例如routing.yml:

somePage:
   pattern: /page/
   defaults: { _controller: "AcmeBundle:Test:index" }

如何获得这个somePage值?


当前回答

使用Twig: {{app.request.attributes.get('_route')}}

其他回答

使用Symfony 4.2.7,我能够在我的树枝模板中实现以下内容,它显示了我在控制器中定义的自定义路由名。

在index.html.twig

<div class="col">
    {% set current_path =  app.request.get('_route') %}
    {{ current_path }}
</div>

在控制器中


    ...

    class ArticleController extends AbstractController {
        /**
         * @Route("/", name="article_list")
         * @Method({"GET"})
         */
        public function index() {
        ...
        }

        ...
     }

结果将“article_list”打印到浏览器中的所需页面。

要根据URL获取当前路由(在转发的情况下更可靠):

public function getCurrentRoute(Request $request)
{
    $pathInfo    = $request->getPathInfo();
    $routeParams = $this->router->match($pathInfo);
    $routeName   = $routeParams['_route'];
    if (substr($routeName, 0, 1) === '_') {
        return;
    }
    unset($routeParams['_route']);

    $data = [
        'name'   => $routeName,
        'params' => $routeParams,
    ];

    return $data;
}

Symfony 2.0 - -2.1 用这个:

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

这个不会给你_internal。

针对Symfony 2.2+的更新:启动Symfony 2.2+时无法正常工作。我打开了一个漏洞,答案是“故意的”。如果希望在子操作中获取路由,则必须将其作为参数传入

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

你的控制器:

public function menuAction($route) { ... }

来自ContainerAware(比如控制器):

$request = $this->container->get('request');
$routeName = $request->get('_route');

_route不是我们要走的路,从来都不是。根据创建Symfony的Fabien的说法,它总是用于调试目的。它是不可靠的,因为它不能用于转发和其他对控制器的直接调用,如部分呈现。

你需要在你的控制器中注入你的路由名作为参数,请看这里的文档

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