pobrać aktualny adres URL w szablonie twig?

169

Rozejrzałem się za kodem, aby uzyskać bieżącą ścieżkę w szablonie Twig (a nie pełny adres URL), tj. Nie chcę http://www.sitename.com/page, tylko potrzebuję /page.

Mark Cibor
źródło
11
NIE jest to dokładny duplikat, ponieważ odpowiedź nr 2 zawiera niezbędne informacje (o parametrach żądania), których nie zawiera połączone pytanie. Należy połączyć odpowiedź nr 2 z połączonym pytaniem.
Victor Sergienko
1
spróbuj app.request.requestUri.
Kristóf Dombi
7
Wcale nie naśladownictwo. Głosowanie za ponownym otwarciem. Publikowanie odpowiedzi jako komentarz, ponieważ nie mogę teraz odpowiedzieć ... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}( getBaseUrlbit jest opcjonalny; potrzebny tylko, jeśli nie jest zainstalowany w katalogu głównym domeny)
mpen

Odpowiedzi:

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

Jeśli chcesz wczytać go do zmiennej widoku:

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

appZmienna globalna widok zawiera wszystkie rodzaje przydatnych skrótów, jak app.sessioni app.security.token.user, które odwołują się do usługi można użyć w kontrolerze.

Rodney Folz
źródło
9
niestety to nie zadziała, jeśli masz trasę z obowiązkowymi parametrami.
Martin Schuhfuß
Jeśli używasz Twig bez Symfony, możesz zrobić coś takiego: $ twig-> addGlobal ("CurrentUrl", $ _SERVER ["REQUEST_URI"]);
GateKiller
1
Jeśli Twoja trasa ma obowiązkowe parametry, zobacz odpowiedź poniżej .
Sam
@GateKiller Spowodowało to niepowodzenie mojego testu funkcjonalnego:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Robin
Dzięki za niesamowitą odpowiedź, bardzo pomocna!
Vahe Shadunts
199

Pobierz aktualny adres URL : {{ app.request.uri }}w Symfony 2.3, 3, 4, 5


Pobierz tylko ścieżkę : {{ app.request.pathinfo }}(bez parametrów)


Uzyskaj identyfikator żądania uri : {{ app.request.requesturi }}(z parametrami)

mrzmyr
źródło
1
To jedyny, który działał dla mnie. Wszyscy inni pominęli parametry zapytania, które nie były częścią trasy lub opierały się na kontrolerze, a nie na Twig.
Craig
13
Aby uzyskać ścieżkę, wypróbuj {{ app.request.pathinfo }}lub zobacz listę dostępnych metod w/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael
2
To powinna być prawidłowa odpowiedź. Krótkie i gładkie.
Fabian Picone
2
uripobiera adres URL z parametrami. pathinfouzyskuje ścieżkę z NO parametrów. requestUripobiera ścieżkę z parametrami. requestUrinależy dodać do tej odpowiedzi IMO. Rzadko będziesz potrzebować domeny i rzadko będziesz chciał usunąć parametry.
rybo111
115

W symfony 2.1 możesz użyć tego:

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

W symfony 2.0 jednym z rozwiązań jest napisanie do tego rozszerzenia 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;
}

I używaj w ten sposób

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

Nie będziesz potrzebować tego wszystkiego, chyba że chcesz dodać dodatkowe parametry do swoich linków, na przykład na pagerze, lub chcesz zmienić jeden z parametrów.

Bártfai Tamás
źródło
11
Jeśli chcesz wygenerować bieżący link w Twig i zmienić locale do zmiany języka, możesz to zrobić w Symfony 2.1 w następujący sposób: {{path (app.request.attributes.get ('_ route'), app.request.attributes .get ('_ route_params') | merge ({'_ locale': 'ja'}))}} Może działać, jeśli użyjesz rozszerzenia Twig autorstwa Bártfai Tamása
Naytzyrhc
W przypadku Twojej implementacji 2.0 pojawia się błąd informujący, że nie ma kontenera. Więc dodałem zmienną, tak jak jest to zrobione w PagerfantaBundle, ale potem mówi, że muszę zaimplementować ContainerInterface?
Squazic
Musisz utworzyć konstruktora dla tego rozszerzenia, które ma parametr $ container. Następnie w konfiguracji DIC musisz zadeklarować kontener jako parametr rozszerzenia. Tak jak tutaj w TwigBundle
Bártfai Tamás
12
Parametry _route_parameters nie będą działać, jeśli w ciągu zapytania znajdują się dodatkowe parametry. Możesz zamiast tego użyć app.request.query.all.
wdev
34

Możesz pobrać aktualny adres URL w Twig w następujący sposób:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
Zaheer Babar
źródło
20

Należy zauważyć, że jeśli masz dodatkowe parametry zapytania w swoim adresie URL, które nie częścią skonfigurowanej trasy, zaakceptowana odpowiedź nie będzie uwzględniać ich w bieżącym adresie URL (ścieżce).

Dlaczego chcesz mieć dodatkowe parametry?

Na przykład, jeśli masz stronę listy z rekordami, które można filtrować według słów kluczowych, a strona ma paginację, najprawdopodobniej zmienne zapytania dla „słowa kluczowego” i „strony” nie będą na Twojej trasie. Ale w przyciskach do przodu i do tyłu do stronicowania potrzebujesz pełnego bieżącego adresu URL (zawierającego słowa kluczowe, aby następna strona była nadal filtrowana). I musisz zmodyfikować zmienną strony.

Jak scalić dodatkowe parametry zapytania

Możesz więc pobrać aktualną trasę i połączyć dodatkowe zmienne (po zmodyfikowaniu jednej lub więcej z tych dodatkowych zmiennych). Zwróć uwagę, że scalasz swoje własne zmienne do app.request.query.all, a następnie scalasz tę tablicę do app.request.attributes.get('_route_params'). path()Metoda wymaga, aby podać wszystkie wymagane parametry trasy, dlatego trzeba zaliczyć _route_params.

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

To naprawdę brzydkie, ale jeśli rozwijasz paginację, będziesz musiał zmodyfikować zmienną strony w każdym oddzielnym linku, więc za każdym razem musisz uwzględniać całość. Być może inni mają lepsze rozwiązanie.

Chadwick Meyer
źródło
2
Prawdopodobnie powinno być{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk
2

Jeśli używasz Silex 2, nie możesz już uzyskać dostępu do obiektu Request.

W ten sposób możesz uzyskać dostęp do atrybutów bieżącego żądania.

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

Aby wygenerować pełny aktualny adres URL: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))

Tim
źródło
Można uzyskać aktualny adres URL w Gałązka / Silex 2 tak: global.request.attributes.get('_route'). Wymagany jest mostek Twig .
dsoms