отримати поточну URL-адресу в гілочку шаблону?


169

Я оглянув код, щоб отримати поточний шлях у шаблоні Twig (а не повну URL-адресу), тобто я не хочу http://www.sitename.com/page, мені лише потрібно /page.


11
Це НЕ точний дублікат, оскільки відповідь №2 містить необхідну інформацію (про параметри запиту), яку пов'язане питання не надає. Відповідь №2 слід об’єднати у пов’язане питання.
Віктор Сергієнко

1
спробуйте app.request.requestUri.
Крістоф Домбі

7
Зовсім не дупа. Голосування за повторне відкриття. Опублікувавши свою відповідь як коментар, тому що мені зараз заборонено відповідати ... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}( getBaseUrlбіт необов’язковий; потрібен лише, якщо він не встановлений до кореня домену)
1313

Відповіді:


250
{{ path(app.request.attributes.get('_route'),
     app.request.attributes.get('_route_params')) }}

Якщо ви хочете прочитати його у змінній перегляду:

{% set currentPath = path(app.request.attributes.get('_route'),
                       app.request.attributes.get('_route_params')) %}

appГлобальний змінний вид містить всі види корисних ярликів, такі , як app.sessionі app.security.token.user, які посилаються на послуги , які ви могли б використовувати в контролері.


9
на жаль, це не спрацює, якщо у вас є маршрут із обов'язковими параметрами.
Мартін Шухфус

Якщо ви використовуєте Twig без Symfony, ви можете зробити щось подібне: $ twig-> addGlobal ("CurrentUrl", $ _SERVER ["REQUEST_URI"]);
GateKiller

1
Якщо ваш маршрут має обов'язкові параметри, дивіться відповідь нижче .
Сем

@GateKiller Це зробило мою функціональну перевірку:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Робін

Дякую за чудову відповідь, дуже корисна!
Vahe Shadunts

199

Отримайте поточну URL-адресу : {{ app.request.uri }}у Symfony 2.3, 3, 4, 5


Отримати лише шлях : {{ app.request.pathinfo }}(без параметрів)


Отримати запит uri : {{ app.request.requesturi }}(з параметрами)


1
Це єдиний, хто працював на мене. Всі інші пропустили параметри запиту, які не входили до маршруту, або покладалися на контролер, а не на Twig.
Крейг

13
Щоб отримати шлях, спробуйте {{ app.request.pathinfo }}або подивіться список доступних методів у/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Майкл,

2
Це має бути правильна відповідь. Короткий і гладкий.
Фабіан Піконе

2
uriотримує URL-адресу з параметрами. pathinfoотримує шлях з параметрами NO . requestUriотримує шлях з параметрами З. requestUriслід додати до цієї відповіді ІМО. Вам рідко знадобиться домен, і ви рідко захочете видалити параметри.
rybo111

115

У symfony 2.1 ви можете використовувати це:

{{ path(app.request.attributes.get('_route'), 
        app.request.attributes.get('_route_params')) }}

У symfony 2.0 одне рішення - написати розширення гілочки для цього

public function getFunctions()
{
    return array(
        'my_router_params' => new \Twig_Function_Method($this, 'routerParams'),
    );
}

/**
 * Emulating the symfony 2.1.x $request->attributes->get('_route_params') feature.
 * Code based on PagerfantaBundle's twig extension.
 */
public function routerParams()
{
    $router = $this->container->get('router');
    $request = $this->container->get('request');

    $routeName = $request->attributes->get('_route');
    $routeParams = $request->query->all();
    foreach ($router->getRouteCollection()->get($routeName)->compile()->getVariables() as $variable) {
        $routeParams[$variable] = $request->attributes->get($variable);
    }

    return $routeParams;
}

І використовуйте так

{{ path(app.request.attributes.get('_route'), my_router_params()|merge({'additional': 'value'}) }}

Все це вам не знадобиться, якщо ви не хочете додати додаткові параметри до своїх посилань, як-от у пейджері, або не захочете змінити один із параметрів.


11
Якщо ви хочете генерувати поточне посилання в Twig та змінити локаль для переключення мови, це можна зробити в Symfony 2.1 наступним чином: {{path (app.request.attributes.get ('_ route'), app.request.attributes .get ('_ route_params') | spajanje ({'_ locale': 'ja'}))}} Це може спрацювати, якщо ви будете використовувати розширення Twig від Bártfai Tamás
Naytzyrhc

Для вашої реалізації 2.0 я отримую помилку, кажучи, що контейнера немає. Тому я додав змінну, як це робиться в PagerfantaBundle, але потім вона говорить, що я повинен реалізувати ContainerInterface?
Squazic

Ви повинні створити конструктор для цього розширення, у якому є параметр $ контейнер. Тоді в конфігурації DIC вам слід оголосити контейнер як параметр для розширення. Як і тут, у TwigBundle
Bártfai Tamás

12
Параметри _route_para не працюватимуть, якщо в рядку запиту є кілька додаткових параметрів. Ви можете використати натомість app.request.query.all.
вд

34

Ви можете отримати поточну URL-адресу в Twig так:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}

20

Слід зазначити, що якщо у вашій URL-адресі є додаткові параметри запиту, це не так входять до налаштованого маршруту, прийнята відповідь не включить їх у поточну URL-адресу (шлях).

Чому ви хочете отримати додаткові параметри?

Наприклад, якщо у вас є сторінка списку із записами, які можна відфільтрувати за ключовим словом, і на сторінці є пагинація, швидше за все, змінні запитів для "ключового слова" та "сторінки" не будуть у вашому маршруті. Але у ваших кнопках вперед та назад для підкачки потрібна повна поточна URL-адреса (яка містить ключові слова, тому наступна сторінка все ще відфільтрована). І вам потрібно змінити змінну сторінки.

Як об’єднати параметри додаткових запитів

Таким чином, ви можете отримати поточний маршрут і об'єднатись у зайвих змінних (після зміни однієї або декількох цих додаткових змінних). Зауважте, що ви об'єднуєте свої власні змінні з app.request.query.all, а потім об'єднуєте цей масив у app.request.attributes.get('_route_params'). path()Метод вимагає , щоб ви надасте всі необхідні параметри маршруту, тому необхідно включати _route_params.

{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge(app.request.query.all|merge({'page': 2 }))) }}

Це справді некрасиво, але якщо ви розробляєте сторінки, вам потрібно буде змінювати змінну сторінки на кожному окремому посиланні, тому вам доведеться щоразу включати все. Можливо, в інших є краще рішення.


2
Напевно, має бути{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk

2

Якщо ви використовуєте Silex 2, ви більше не можете отримати доступ до об’єкта Запити.

Ви можете отримати доступ до поточних атрибутів запиту таким чином.

app.request_stack.currentrequest.attributes.get('_route')

І щоб створити повну поточну URL-адресу: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))


Ви можете отримати поточний URL в Twig / Silex 2 , як це: global.request.attributes.get('_route'). Потрібний гілочний міст .
dsoms
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.