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


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

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

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

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

12 202

12 ответов:

от чего-то, что ContainerAware (как контроллер):

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

С Прутиком : {{ app.request.attributes.get('_route') }}

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

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

    .....

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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