首页 文章

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

提问于
浏览
207

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

例如, routing.yml

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

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

12 回答

  • 187

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

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

    随着Twig: {{ app.request.attributes.get('_route') }}

  • 11

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

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

    Symfony 2.0-2.1
    用这个:

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

    那个人不会给你 _internal .

    Update for Symfony 2.2+: 这无法启动Symfony 2.2 . 我打开bug,答案是"by design" . 如果您希望在子操作中获取路径,则必须将其作为参数传递

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

    而你的控制器:

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

    没有适用于所有用例的解决方案 . 如果您使用$ 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');
    }
    

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

  • 19

    _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'); .

  • 47
    $request->attributes->get('_route');
    

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

  • 4

    我从中得到的只是 _internal

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

    这段代码在Symfony 1.X中被称为'Component'中执行;不是页面的控制器,而是需要一些逻辑的页面的一部分 .

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

  • 306

    使用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>
    
  • 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;
    }
    
  • 27

    对于任何需要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
    ?>
    
  • -2

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

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

    如果你想在树枝上获得路线名称,那么你必须得到它

    {{ app.request.attributes.get('_route') }}
    

相关问题