получить текущий 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бит не является обязательным; требуется только если не установлен в корневой каталог домена)
mpen

Ответы:

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"
Робин
Спасибо за удивительный ответ, очень полезно!
Ваге Шадунц
199

Получить текущий URL : {{ app.request.uri }}в Symfony 2.3, 3, 4, 5


Получить только путь : {{ app.request.pathinfo }}(без параметров)


Получить запрос URI : {{ app.request.requesturi }}(с параметрами)

mrzmyr
источник
1
Это единственный, который работал на меня. Все остальные пропустили параметры запроса, которые не были частью маршрута или полагались на контроллер, а не на Twig.
Крейг,
13
Чтобы получить путь, попробуйте {{ app.request.pathinfo }}или посмотрите список доступных методов в/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael
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') | merge ({'_ locale': 'ja'}))}} Это может сработать, если вы используете расширение Twig от Bártfai Tamás
Naytzyrhc
В вашей версии 2.0 я получаю сообщение об ошибке, в котором говорится, что контейнера нет. Таким образом, я добавил переменную, как это делается в PagerfantaBundle, но затем он говорит, что я должен реализовать ContainerInterface?
Squazic
Вы должны создать конструктор для этого расширения, у которого есть параметр $ container. Затем в конфигурации DIC вы должны объявить контейнер как параметр для расширения. Как здесь в TwigBundle
Bártfai Tamás
12
_Route_parameters не будут работать, если у вас есть дополнительные параметры в строке запроса. Вместо этого вы можете использовать app.request.query.all.
wdev
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, вы больше не можете получить доступ к объекту Request.

Вы можете получить доступ к текущим атрибутам запроса таким образом.

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