Как узнать текущий маршрут в Symfony 2? - PullRequest
213 голосов
/ 17 августа 2011

Как мне получить текущий маршрут в Symfony 2?

Например, routing.yml:

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

Как я могу получить это somePage значение?

Ответы [ 13 ]

311 голосов
/ 17 августа 2011

Из чего-то, что является ContainerAware (например, контроллер):

$request = $this->container->get('request');
$routeName = $request->get('_route');
189 голосов
/ 06 января 2012

С веточкой: {{ app.request.attributes.get('_route') }}

47 голосов
/ 08 августа 2012

Я думаю, что это самый простой способ сделать это:

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

    .....
27 голосов
/ 26 июля 2012

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) { ... }
19 голосов
/ 17 марта 2014

Не существует решения, которое работает для всех случаев использования. Если вы используете метод $ 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');
}

Вы можете сделать из этого расширение ветки, если вам это нужно в шаблонах.

11 голосов
/ 30 декабря 2016

_route - это не тот путь и никогда не было . Он всегда предназначался для отладки по словам Фабьена, создавшего Symfony.Это ненадежно, так как не будет работать с такими вещами, как переадресация и другие прямые вызовы контроллеров, такими как частичный рендеринг.

Вам необходимо ввести имя вашего маршрута в качестве параметра в вашем контроллере, см. Документ здесь

Кроме того, пожалуйста, никогда не используйте $request->get('');, если вам не нужна гибкость, это намного медленнее, чем использование get для конкретного мешка свойств, который вам нужен (атрибуты, запрос или запрос), поэтому $request->attributes->get('_route'); вэто дело.

7 голосов
/ 01 октября 2013
$request->attributes->get('_route');

Вы можете получить имя маршрута из объекта запроса из контроллера.

4 голосов
/ 15 октября 2011

Все, что я получаю от этого _internal

Я получаю название маршрута из контроллера с $this->getRequest()->get('_route'). Даже код, предложенный tuxedo25, возвращает _internal

Этот код выполняется в так называемом «Компоненте» в Symfony 1.X; Не контроллер страницы, а часть страницы, которая нуждается в некоторой логике.

Эквивалентный код в Symfony 1.X: sfContext::getInstance()->getRouting()->getCurrentRouteName();

2 голосов
/ 04 июня 2017

В 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 голос
/ 08 апреля 2017

Для тех, кому нужен текущий маршрут для 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
?>
...