webentwicklung-frage-antwort-db.com.de

Aktuelle URL in twig template abrufen?

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

148
Mark Cibor
{{ 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 globale Ansichtsvariable app enthält alle möglichen nützlichen Verknüpfungen, z. B. app.session und app.security.token.user, die auf die Dienste verweisen, die Sie möglicherweise in einem Controller verwenden.

233
Rodney Folz

Get aktuelle URL: {{ app.request.uri }} in Symfony 2.3, 3, 4


Get nur Pfad: {{ app.request.pathinfo }}

177
mrzmyr

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

All dies wird nicht benötigt, es sei denn, Sie möchten Ihren Links zusätzliche Parameter hinzufügen, z. B. in einem Pager, oder Sie möchten einen der Parameter ändern.

114
Bártfai Tamás

Sie können die aktuelle URL in Twig wie folgt abrufen:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
33
Zaheer Babar

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

Warum möchten Sie zusätzliche Parameter?

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 auf Ihrer Route. Für das 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.

So führen Sie zusätzliche Abfrageparameter zusammen

Sie können also 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 app.request.query.all Zusammenführen und dieses Array dann mit app.request.attributes.get('_route_params') zusammenführen. Die path() -Methode erfordert, dass Sie alle erforderlichen Parameter der Route angeben. Aus diesem Grund müssen Sie _route_params Eingeben.

{{ 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 für jeden einzelnen Link ändern, sodass Sie jedes Mal das Ganze einfügen müssen. Vielleicht haben andere eine bessere Lösung.

18
Chadwick Meyer

Wenn Sie Silex 2 verwenden, können Sie nicht mehr auf das Anforderungsobjekt 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'))

1
Tim