получить текущий URL в шаблоне ветки?

114

Возможный дубликат:
Как получить текущий маршрут в Symfony 2?

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

  • 10
    Это НЕ является точной копией, так как ответ № 2 содержит необходимую информацию (о параметрах запроса), которую не содержит связанный вопрос. Нужно объединить ответ № 2 в связанный вопрос.
  • 1
    попробуйте app.request.requestUri.
Показать ещё 1 комментарий
Теги:
twig

6 ответов

177
Лучший ответ
{{ 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
    к сожалению, это не будет работать, если у вас есть маршрут с обязательными параметрами.
  • 4
    Это также не сработает, если вы используете Twig самостоятельно.
Показать ещё 6 комментариев
118

В 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 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'}) }}

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

  • 10
    Если вы хотите сгенерировать текущую ссылку в Twig и изменить локаль для переключения языка, это можно сделать в Symfony 2.1 следующим образом: {{path (app.request.attributes.get ('_ route'), app.request.attributes .get ('_ route_params') | merge ({'_ locale': 'ja'}))}} Это может работать, если вы используете расширение Twig от Bártfai Tamás
  • 0
    В вашей версии 2.0 я получаю сообщение об ошибке, в котором говорится, что контейнера нет. Таким образом, я добавил переменную, как это делается в PagerfantaBundle, но затем он говорит, что я должен реализовать ContainerInterface?
Показать ещё 3 комментария
111

Получить текущий url с помощью {{ app.request.uri }} в Symfony 2.3

  • 1
    Это единственный, который работал на меня. Все остальные пропустили параметры запроса, которые не были частью маршрута, или полагались на контроллер, а не на Twig.
  • 12
    Чтобы получить путь, попробуйте только {{ app.request.pathinfo }} или посмотрите список доступных методов в /vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Показать ещё 3 комментария
24

Вы можете получить текущий URL-адрес в Twig следующим образом:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
  • 0
    Этот работал лучше всего для меня. Это дало мне полный URL, включая http: //
  • 0
    Да, у меня тоже сработало!
13

Следует отметить, что если у вас есть дополнительные параметры запроса в вашем 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 }))) }}

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

  • 0
    Я скучал по app.request.query.all , большое спасибо!
  • 1
    Вероятно, должно быть {{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
1

Если вы используете 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'))

  • 0
    Вы можете получить текущий URL в Twig / Silex 2 следующим образом: global.request.attributes.get('_route') . Требуется веточка моста .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню