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

时间:2011-08-17 16:51:05

标签: php symfony routing symfony-routing

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

例如,routing.yml

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

如何获得此somePage值?

13 个答案:

答案 0 :(得分:310)

来自ContainerAware(如控制器):

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

答案 1 :(得分:189)

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

答案 2 :(得分:47)

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

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

    .....

答案 3 :(得分:27)

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+。我开了bug,答案是“按设计”。如果您希望在子操作中获取路径,则必须将其作为参数传递

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

你的控制器:

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

答案 4 :(得分:19)

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

如果您需要一个甚至可以转发的解决方案,您必须使用新的RequestStack服务,该服务已经到达2.4,但这将会中断ESI support

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

如果你需要在模板中使用它,你可以制作一个枝条扩展名。

答案 5 :(得分:11)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <ul id="list1"> <li class="item">Object 1</li> <li class="item">Object 2</li> <li class="item">Object 3</li> </ul> <ul id="list2"> <li class="item">Object 1</li> <li class="item">Object 2</li> <li class="item">Object 3</li> </ul>不是要走的路,而且永远不是。根据创建Symfony的Fabien的说法It was always meant for debugging purposes。它是不可靠的,因为它不能用于转发和其他直接调用控制器之类的东西,如部分渲染。

您需要将路线的名称作为参数注入控制器see the doc here

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

答案 6 :(得分:7)

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

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

答案 7 :(得分:4)

我从中获得的只是     _internal

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

此代码在Symfony 1.X中所谓的“组件”中执行;不是页面的控制器,而是需要一些逻辑的页面的一部分。

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

答案 8 :(得分: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>

答案 9 :(得分: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;
}

答案 10 :(得分: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
?>

答案 11 :(得分:0)

使用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”打印到我的浏览器中所需的页面。

答案 12 :(得分:-2)

如果您想在控制器中获取路径名而不是注入请求(而不是从Symfony UPGRADE获取容器,而不是调用get('_ route')。

x <- is.na(a)     
split(a[!x], cumsum(x)[!x])

如果你想在树枝上获得路线名称而不是像

那样得到它
public function indexAction(Request $request)
{
    $routeName = $request->get('_route');
}