Як отримати поточний маршрут у Symfony 2?


Відповіді:


323

З того, що є ContainerAware (наприклад, контролер):

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

2
@оберіть перемикання для вас, щоб перевірити meta.stackexchange.com/questions/155258/…
NullPoiитея

37
github.com/symfony/symfony/isissue/854 request.attributes.get ('_ route') не є надійним, оскільки він призначений лише для налагодження (сказав Symfony Dev) і не працює, якщо запит пересилається ... див. відповідь supernova які задокументовані та є більш безпечними
luiges90

3
Причина цього не працює, коли щось пересилається через те, що ви пересилаєте безпосередньо контролер, а не маршрут. Таким чином, Symfony не знає, для чого маршрут. Як правило, у вас є один маршрут до одного контролера, тому може здатися дивним, що це не може повідомити нічого окрім "_внутрішнього", проте можливо створити контролери загального призначення, які пов'язані з більш ніж одним визначенням маршруту. Коли ви все це враховуєте, я думаю, що ця "готча" має більше сенсу.
jzimmerman2011

@ tuxedo25 Подумайте про використання RequestStack: symfony.com/blog/new-in-symfony-2-4-the-request-stack
mYkon

2
$ request-> get ('_ маршрут'); повільно! $ request-> attributes-> get ('_ route'); краще, якщо вам не потрібна гнучкість
Том Том,

190

З гілочкою: {{ app.request.attributes.get('_route') }}


8
Дякую! Я використовую <body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">для застосування CSS-файлу для сторінки :)
Salman von Abbas

10
github.com/symfony/symfony/isissue/854 request.attributes.get ('_ route') не є надійним, оскільки він призначений лише для налагодження (сказав Symfony Dev) і не працює, якщо запит пересилається ... див. відповідь supernova які задокументовані та є більш безпечними
luiges90

48

Я думаю, що це найпростіший спосіб зробити це:

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

    .....

3
Чи можете ви додати більше пояснень чи показати вибірки, щоб уточнити, як це вирішує проблему?
Чарлі


1
@Charlie Це заздалегідь визначена змінна, яка дає вам узгоджений маршрут "ім'я"
supernova

2
Це, безумовно, найкраща відповідь на початкове запитання. Як зауваження: однак це не працює з {% render "SomeBundle:SomeController:someAction" %}підзапросами на зразок , де ви знову отримаєте значення '_internal'.
netmikey

2
Шкода, що це працює лише в оригінальній програмі Action, для будь-якої іншої функції її потрібно переадресувати.
Дарек Ведріховський

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+. Я відкрив помилку, і відповідь була «задумом». Якщо ви хочете отримати маршрут у підгрупі, вам слід передати його як аргумент

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

І ваш контролер:

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

github.com/symfony/symfony/isissue/854 Я не впевнений у цьому, $route['_route']здається проблематичним, але це може бути не симфонічним розмовом про розробку. Куховарська книга не згадує про _routeпро $router->match()вихід ..
luiges90

Я повністю згоден з @ luiges90. PHPDoc $router->match()говорить "масив @return Масив параметрів", який здається дуже внутрішнім. Я не хочу на це покладатися, але зараз, здається, це єдине життєздатне рішення при роботі з підзапросами.
netmikey

19

Не існує рішення, яке б працювало для всіх випадків використання. Якщо ви використовуєте метод $ 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');
}

Ви можете зробити розширення гілочки з цього, якщо вам це потрібно в шаблонах.


Отже ... як ваше рішення не працює точно для всіх випадків використання?
greg0ire

11

_routeце не шлях і ніколи не був . Він завжди був призначений для налагодження за словами Фаб'єна, який створив Symfony. Це ненадійно, оскільки не працюватиме з такими речами, як переадресація та інші прямі дзвінки до контролерів, як часткове надання.

Вам потрібно ввести ім'я маршруту як параметр у контролері, див. Тут документ

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


4
Гаразд, ви в основному пропонуєте додавати додаткову інформацію до всіх маршрутів у цих файлах, а не отримувати назву маршруту? …
Шараф

1
Так, особливо якщо вам потрібно мати можливість зателефонувати самому контролеру пізніше вниз по лінії (вперед, часткове візуалізація тощо), передача імені в якості параметра є єдиним способом, тому що ви взагалі не викликаєте маршрут справа. Що стосується _route, призначеного для налагодження, не знімайте його на мене ^^ '
Том Том,

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

Ви можете отримати назву маршруту від об’єкта запиту зсередини контролера.


4

Все, що я отримую від цього, - це _internal

Я отримую назву маршруту зсередини контролера з $this->getRequest()->get('_route'). пропонованими поверненнями навіть кодом tuxedo25_internal

Цей код виконується в тому, що в Symfony 1.X називалося "Компонент"; Не контролер сторінки, а частина сторінки, яка потребує певної логіки.

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


2
Вирішив сам. На виду:$view['request']->getParameter('_route');
Алексизморін

5
це тому, що ви використовуєте {% render... %}дзвінки разом із standalone=true. Якщо увімкнено кешування (AppCache.php або лак з ESI), це призведе до запиту автономних представлень окремим HTTP-запитом (саме тут _internalтрапляється маршрут ), щоб ro було самостійно кешоване.
Мартін Шухфус

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>

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;
}

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" на потрібну сторінку в моєму браузері.


0

Для тих, хто потребує поточного маршруту для 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
   $name = $request->get('_route'); // This will return the name.
?>

3
Це не поверне назву оброблюваного маршруту
Ніко Хаазе

@NicoHaase Це не ракетна наука, у вас вже є об’єкт запиту
Aderemi Dayo

-2

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

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

якщо ви хочете отримати ім'я маршруту в гілочку, ніж вам доведеться його отримати

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

1
Не рекомендується використовувати $request->get()безпосередньо, оскільки це повільно: github.com/symfony/http-foundation/blob/2.8/Request.php#L712
ricko zoe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.