ottenere l'URL corrente nel modello di ramoscello?


169

Ho cercato il codice per ottenere il percorso corrente in un modello Twig (e non l'URL completo), ovvero non voglio http://www.sitename.com/page, ne ho solo bisogno /page.


11
Questo NON è un duplicato esatto, poiché la risposta n. 2 contiene le informazioni necessarie (sui parametri della richiesta) che la domanda collegata non fornisce. Si dovrebbe unire la risposta n. 2 alla domanda collegata.
Victor Sergienko,

1
prova app.request.requestUri.
Kristóf Dombi,

7
Non è affatto un imbecille. Votazione per riaprire. Pubblicando la mia risposta come commento perché non sono autorizzato a rispondere ora ... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}( getBaseUrlbit è facoltativo; necessario solo se non installato sulla radice del dominio)
mpen

Risposte:


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

Se vuoi leggerlo in una variabile di visualizzazione:

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

La appvariabile di visualizzazione globale contiene tutti i tipi di scorciatoie utili, come app.sessione app.security.token.user, che fanno riferimento ai servizi che è possibile utilizzare in un controller.


9
sfortunatamente, questo non funzionerà se si dispone di un percorso con parametri obbligatori.
Martin Schuhfuß,

Se stai usando Twig senza Symfony puoi fare qualcosa del genere: $ twig-> addGlobal ("CurrentUrl", $ _SERVER ["REQUEST_URI"]);
GateKiller,

1
Se il tuo percorso ha parametri obbligatori, vedi la risposta di seguito .
Sam,

@GateKiller Questo ha fatto fallire il mio test funzionale:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Robin

Grazie per una risposta straordinaria, molto utile!
Vahe Shadunts,

199

Ottieni l'URL attuale : {{ app.request.uri }}in Symfony 2.3, 3, 4, 5


Ottieni solo percorso : {{ app.request.pathinfo }}(senza parametri)


Ottieni la richiesta uri : {{ app.request.requesturi }}(con parametri)


1
Questo è l'unico che ha funzionato per me. Tutti gli altri hanno perso i parametri di query che non facevano parte del percorso o si basavano sul controller e non su Twig.
Craig,

13
Per ottenere il percorso prova solo a {{ app.request.pathinfo }}visualizzare un elenco dei metodi disponibili in/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael

2
Questa dovrebbe essere la risposta corretta. Corto e liscio
Fabian Picone,

2
uriottiene l'URL con i parametri. pathinfoottiene il percorso con NO parametri. requestUriottiene il percorso CON parametri. requestUridovrebbe essere aggiunto a questa risposta IMO. Raramente avrai bisogno del dominio e raramente vorrai rimuovere i parametri.
Rybo111,

115

In symfony 2.1 puoi usare questo:

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

In symfony 2.0, una soluzione è scrivere un'estensione ramoscello per questo

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

E usare così

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

Non avrai bisogno di tutto questo a meno che tu non voglia aggiungere parametri aggiuntivi ai tuoi collegamenti, come in un cercapersone, o non desideri cambiare uno dei parametri.


11
Se vuoi generare il collegamento corrente in Twig e cambiare le impostazioni locali per il cambio di lingua, puoi farlo in Symfony 2.1 come segue: {{path (app.request.attributes.get ('_ route'), app.request.attributes .get ('_ route_params') | merge ({'_ locale': 'ja'}))}} Potrebbe funzionare se usi l'estensione Twig di Bártfai Tamás
Naytzyrhc il

Per l'implementazione 2.0, viene visualizzato un errore che indica che non esiste un contenitore. Quindi ho aggiunto la variabile come avviene in PagerfantaBundle, ma poi dice che devo implementare ContainerInterface?
Squazic,

Devi creare un costruttore per questa estensione, che ha un parametro $ container. Quindi nella configurazione DIC è necessario dichiarare il contenitore come parametro per l'estensione. Come qui nel TwigBundle
Bártfai Tamás,

12
I parametri _route_ non funzioneranno se nella stringa della query sono presenti parametri aggiuntivi. Puoi invece usare app.request.query.all.
wdev,

34

Puoi ottenere l'URL corrente in Twig in questo modo:

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

20

Va notato che se nel proprio URL sono presenti parametri di query aggiuntivi, che non fanno parte del percorso configurato, la risposta accettata non li includerà nell'URL (percorso) corrente.

Perché vorresti parametri extra?

Ad esempio, se si dispone di una pagina elenco con record che possono essere filtrati per parola chiave e la pagina ha impaginazione, molto probabilmente le variabili di query per "parola chiave" e "pagina" non saranno nel percorso. Ma nei pulsanti avanti e indietro per il paging, è necessario l'URL corrente completo (che contiene le parole chiave in modo che la pagina successiva sia ancora filtrata). E devi modificare la variabile di pagina.

Come unire parametri di query extra

Quindi puoi ottenere il percorso corrente e unirti alle variabili extra (dopo aver modificato una o più di quelle variabili extra). Si noti che si stanno unendo le proprie variabili a app.request.query.all, quindi si unisce quell'array a app.request.attributes.get('_route_params'). Il path()metodo richiede di fornire tutti i parametri richiesti del percorso, motivo per cui è necessario includere il _route_params.

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

È davvero brutto, ma se stai sviluppando l'impaginazione, dovrai modificare la variabile di pagina su ciascun collegamento separato, quindi devi includere tutto ogni volta. Forse altri hanno una soluzione migliore.


2
Probabilmente dovrebbe essere{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk,

2

Se si utilizza Silex 2 non è più possibile accedere all'oggetto Richiesta.

È possibile accedere agli attributi della richiesta corrente in questo modo.

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

E per generare l'URL corrente completo: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))


È possibile ottenere l'URL corrente in Twig / Silex 2 in questo modo: global.request.attributes.get('_route'). Twig bridge è richiesto.
dsoms,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.