Aktuelle URL in Zweigvorlage erhalten?

169

Ich habe mich nach dem Code umgesehen, um den aktuellen Pfad in einer Twig-Vorlage (und nicht die vollständige URL) zu erhalten, dh ich möchte nicht http://www.sitename.com/page, ich brauche nur /page.

Mark Cibor
quelle
11
Dies ist KEIN genaues Duplikat, da Antwort 2 die erforderlichen Informationen (zu Anforderungsparametern) enthält, die die verknüpfte Frage nicht enthält. Man sollte die Antwort Nr. 2 in die verknüpfte Frage einfügen.
Victor Sergienko
1
Versuchen Sie es mit app.request.requestUri.
Kristóf Dombi
7
Überhaupt kein Betrüger. Abstimmung zur Wiedereröffnung. Poste meine Antwort als Kommentar, weil ich jetzt nicht antworten darf ... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}( getBaseUrlBit ist optional; wird nur benötigt, wenn es nicht im Stammverzeichnis der Domain installiert ist)
mpen

Antworten:

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

Wenn Sie es in eine Ansichtsvariable einlesen möchten:

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

Die appglobale Ansichtsvariable enthält alle möglichen nützlichen Verknüpfungen, z. B. app.sessionund app.security.token.user, die auf die Dienste verweisen, die Sie möglicherweise in einem Controller verwenden.

Rodney Folz
quelle
9
Leider funktioniert dies nicht, wenn Sie eine Route mit obligatorischen Parametern haben.
Martin Schuhfuß
Wenn Sie Twig ohne Symfony verwenden, können Sie Folgendes tun: $ twig-> addGlobal ("CurrentUrl", $ _SERVER ["REQUEST_URI"]);
GateKiller
1
Wenn Ihre Route obligatorische Parameter hat, lesen Sie die Antwort unten .
Sam
@GateKiller Dies ließ meinen Funktionstest fehlschlagen:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Robin
Vielen Dank für eine tolle Antwort, sehr hilfreich!
Vahe Shadunts
199

Erhalten Sie aktuelle URL : {{ app.request.uri }}in Symfony 2.3, 3, 4, 5


Erhalten Sie Pfad nur : {{ app.request.pathinfo }}(ohne Parameter)


Get request uri : {{ app.request.requesturi }}(mit Parametern)

mrzmyr
quelle
1
Dies ist der einzige, der für mich gearbeitet hat. Alle anderen haben Abfrageparameter verpasst, die nicht Teil der Route waren oder sich auf den Controller und nicht auf Twig stützten.
Craig
13
Um den Pfad nur zu erhalten, versuchen {{ app.request.pathinfo }}Sie, eine Liste der verfügbaren Methoden in/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael
2
Dies sollte die richtige Antwort sein. Kurz und glatt.
Fabian Picone
2
uriRuft die URL mit Parametern ab. pathinfowird der Pfad mit NO - Parameter. requestUriRuft den Pfad mit Parametern. requestUrisollte zu dieser Antwort IMO hinzugefügt werden. Sie benötigen die Domain selten und möchten die Parameter selten entfernen.
Rybo111
115

In Symfony 2.1 können Sie Folgendes verwenden:

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

In Symfony 2.0 besteht eine Lösung darin, eine Zweigerweiterung dafür zu schreiben

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;
}

Und so verwenden

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

Sie benötigen dies alles nur, wenn Sie Ihren Links zusätzliche Parameter hinzufügen möchten, z. B. in einem Pager, oder wenn Sie einen der Parameter ändern möchten.

Bártfai Tamás
quelle
11
Wenn Sie den aktuellen Link in Twig generieren und das Gebietsschema für den Sprachwechsel ändern möchten, können Sie dies in Symfony 2.1 wie folgt tun: {{path (app.request.attributes.get ('_ route'), app.request.attributes .get ('_ route_params') | merge ({'_ locale': 'ja'}))}} Es kann funktionieren, wenn Sie die Twig-Erweiterung von Bártfai Tamás
Naytzyrhc verwenden
Bei Ihrer 2.0-Implementierung wird die Fehlermeldung angezeigt, dass kein Container vorhanden ist. Also habe ich die Variable hinzugefügt, wie es in PagerfantaBundle gemacht wird, aber dann heißt es, dass ich das ContainerInterface implementieren muss?
Squazic
Sie müssen einen Konstruktor für diese Erweiterung erstellen, der einen $ container-Parameter enthält. Dann müssen Sie in der DIC-Konfiguration den Container als Parameter für die Erweiterung deklarieren. Wie hier im TwigBundle
Bártfai Tamás
12
Die _route_parameters funktionieren nicht, wenn Ihre Abfragezeichenfolge einige zusätzliche Parameter enthält. Sie können stattdessen app.request.query.all verwenden.
wdev
34

Sie können die aktuelle URL in Twig folgendermaßen abrufen:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
Zaheer Babar
quelle
20

Es sollte beachtet werden, dass wenn Sie zusätzliche Abfrageparameter in Ihrer URL haben, diese nicht sind Teil der konfigurierten Route sind, die akzeptierte Antwort diese nicht in die aktuelle URL (Pfad) einbezieht.

Warum sollten Sie zusätzliche Parameter wünschen?

Wenn Sie beispielsweise eine Listenseite mit Datensätzen haben, die nach Schlüsselwörtern gefiltert werden können, und die Seite eine Paginierung aufweist, befinden sich die Abfragevariablen für "Schlüsselwort" und "Seite" höchstwahrscheinlich nicht in Ihrer Route. In Ihren Vorwärts- und Rückwärtsschaltflächen zum Blättern benötigen Sie jedoch die vollständige aktuelle URL (die die Schlüsselwörter enthält, damit die nächste Seite weiterhin gefiltert wird). Und Sie müssen die Seitenvariable ändern.

Zusammenführen zusätzlicher Abfrageparameter

So können Sie die aktuelle Route abrufen und die zusätzlichen Variablen zusammenführen (nachdem Sie eine oder mehrere dieser zusätzlichen Variablen geändert haben). Beachten Sie, dass Sie Ihre eigenen Variablen mit dem zusammenführen app.request.query.allund dieses Array dann mit dem zusammenführen app.request.attributes.get('_route_params'). Die path()Methode erfordert, dass Sie alle erforderlichen Parameter der Route angeben, weshalb Sie die einschließen müssen _route_params.

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

Das ist wirklich hässlich, aber wenn Sie eine Paginierung entwickeln, müssen Sie die Seitenvariable in jedem einzelnen Link ändern, sodass Sie jedes Mal das Ganze einfügen müssen. Vielleicht haben andere eine bessere Lösung.

Chadwick Meyer
quelle
2
Wahrscheinlich sollte{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk
2

Wenn Sie Silex 2 verwenden, können Sie nicht mehr auf das Request-Objekt zugreifen.

Auf diese Weise können Sie auf die aktuellen Anforderungsattribute zugreifen.

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

Und um die vollständige aktuelle URL zu generieren: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))

Tim
quelle
Sie können die aktuelle URL in Twig / Silex 2 folgendermaßen abrufen : global.request.attributes.get('_route'). Zweigbrücke ist erforderlich.
Dsoms