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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

    .....

Ответ 4

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) { ... }

Ответ 5

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

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

Ответ 6

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

Вам нужно ввести название маршрута в качестве параметра в вашем контроллере, посмотреть здесь документ

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

Ответ 7

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

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

Ответ 8

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

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

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

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

Ответ 9

С 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>

Ответ 10

Чтобы получить текущий маршрут на основе 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;
}

Ответ 11

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

Ответ 12

В 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" на нужную страницу в моем браузере.

Ответ 13

если вы хотите получить имя маршрута в своем контроллере, вместо того, чтобы вводить запрос (вместо получения из контейнера из-за Symfony UPGRADE и чем вызов get ('_ route').

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

если вы хотите получить имя маршрута в ветке, чем вы должны получить его как

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