241

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

例如routing.yml

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

我怎样才能得到这个somePage值?

4

13 回答 13

340

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

$request = $this->container->get('request');
$routeName = $request->get('_route');
于 2011-08-17T16:55:06.793 回答
192

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

于 2012-01-06T09:34:34.130 回答
48

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

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

    .....
于 2012-08-08T15:51:59.643 回答
29

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) { ... }
于 2012-07-26T00:38:22.267 回答
21

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

如果你需要一个即使转发也能工作的解决方案,你必须使用新的 RequestStack 服务,它在 2.4 中出现,但这会破坏ESI 支持

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

如果你在模板中需要它,你可以用它来做一个树枝扩展。

于 2014-03-17T14:02:31.243 回答
12

_route不是要走的路,从来没有。根据创建 Symfony 的 Fabien的说法,它总是用于调试目的。它不可靠,因为它不适用于转发和其他对控制器的直接调用(如部分渲染)。

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

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

于 2016-12-30T08:16:12.883 回答
8
$request->attributes->get('_route');

您可以从控制器内的请求对象中获取路由名称。

于 2013-10-01T09:46:54.287 回答
4

我从中得到的只是 _internal

我从控制器内部获取路由名称,$this->getRequest()->get('_route'). 即使代码 tuxedo25 建议返回_internal

这段代码在 Symfony 1.X 中被称为“组件”的地方执行;不是页面的控制器,而是需要一些逻辑的页面的一部分。

Symfony 1.X 中的等效代码是:sfContext::getInstance()->getRouting()->getCurrentRouteName();

于 2011-10-15T10:28:32.507 回答
2

使用 Symfony 3.3,我使用了这种方法并且工作正常。

我有 4 条路线,例如

admin_category_index、admin_category_detail、admin_category_create、admin_category_update

并且只有一条线为所有路线创建了一个活动类。

<li  {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
 <a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
于 2017-06-04T17:46:13.087 回答
1

根据 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;
}
于 2017-02-04T05:57:48.280 回答
1

对于任何需要 Symfony 3 当前路线的人,这就是我使用的

<?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
   $name = $request->get('_route'); // This will return the name.
?>
于 2017-04-08T14:40:03.770 回答
0

使用 Symfony 4.2.7,我可以在我的 twig 模板中实现以下内容,该模板显示了我在控制器中定义的自定义路由名称。

在 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”打印到所需页面。

于 2019-05-03T02:49:34.493 回答
-2

如果您想在控制器中获取路由名称,则必须注入请求(而不是由于Symfony UPGRADE 而从容器获取,而不是调用 get('_route').

public function indexAction(Request $request)
{
    $routeName = $request->get('_route');
}

如果您想在树枝中获取路线名称,则必须像这样

{{ app.request.attributes.get('_route') }}
于 2016-04-25T21:12:38.573 回答