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

Я искал код, чтобы получить текущий путь в шаблоне веточки (а не полный URL), т. е. Я не хочу!--0-->, Мне нужен только /page.

6 ответов


{{ 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 переменная global view содержит всевозможные полезные ярлыки, такие как app.session и app.security.token.user, которые ссылаются на службы, которые вы можете использовать в контроллере.


Get текущий url: {{ app.request.uri }} на Symfony 2.3, 3, 4


Get путь только: {{ app.request.pathinfo }}


в symfony 2.1 вы можете использовать следующее:

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

в symfony 2.0 одним из решений является написание расширения twig для этого

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

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


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

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

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

зачем вам нужны дополнительные параметры?

например, если у вас есть страница списка с записями, которые могут быть отфильтрованы по ключевому слову, и страница имеет разбиение на страницы, скорее всего, переменные запроса для "keyword" и "page" не будут в вашем маршруте. Но в твоем кнопки вперед и назад для подкачки вам нужен полный текущий URL (который содержит ключевые слова, поэтому следующая страница все еще фильтруется). И вам нужно изменить переменную page.

как объединить Дополнительные параметры запроса

таким образом, вы можете получить текущий маршрут и объединить дополнительные переменные (после изменения одной или нескольких из этих дополнительных переменных). Обратите внимание, что вы объединяете свои собственные переменные в app.request.query.all, а затем слияние этого массива в app.request.attributes.get('_route_params'). The path() метод требует, чтобы вы предоставили все необходимые параметры маршрута, поэтому вам нужно включить _route_params.

{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge(app.request.query.all|merge({'page': 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'))