obtenir l'URL actuelle dans le modèle de brindille?

169

J'ai cherché le code pour obtenir le chemin actuel dans un modèle Twig (et non l'URL complète), c'est-à-dire que je ne veux pas http://www.sitename.com/page, j'ai seulement besoin /page.

Mark Cibor
la source
11
Ce n'est PAS un doublon exact, car la réponse n ° 2 contient des informations nécessaires (sur les paramètres de demande) que la question liée ne fournit pas. Il faut fusionner la réponse n ° 2 dans la question liée.
Victor Sergienko
1
essayez app.request.requestUri.
Kristóf Dombi
7
Pas du tout dupe. Voter pour rouvrir. Publier ma réponse sous forme de commentaire car je ne suis pas autorisé à répondre maintenant ... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}(le getBaseUrlbit est facultatif; seulement nécessaire s'il n'est pas installé à la racine du domaine)
mpen

Réponses:

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

Si vous souhaitez le lire dans une variable de vue:

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

La appvariable de vue globale contient toutes sortes de raccourcis utiles, tels que app.sessionet app.security.token.user, qui référencent les services que vous pouvez utiliser dans un contrôleur.

Rodney Folz
la source
9
malheureusement, cela ne fonctionnera pas si vous avez un itinéraire avec des paramètres obligatoires.
Martin Schuhfuß
Si vous utilisez Twig sans Symfony, vous pouvez faire quelque chose comme ceci: $ twig-> addGlobal ("CurrentUrl", $ _SERVER ["REQUEST_URI"]);
GateKiller
1
Si votre itinéraire comporte des paramètres obligatoires, consultez la réponse ci-dessous .
Sam
@GateKiller Cela a fait échouer mon test fonctionnel:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Robin
Merci pour une réponse incroyable, très utile!
Vahe Shadunts
199

Obtenir l'url actuelle : {{ app.request.uri }}dans Symfony 2.3, 3, 4, 5


Obtenir le chemin uniquement : {{ app.request.pathinfo }}(sans paramètres)


Obtenir l' URI de la demande : {{ app.request.requesturi }}(avec les paramètres)

mrzmyr
la source
1
C'est le seul qui a fonctionné pour moi. Tous les autres ont manqué des paramètres de requête qui ne faisaient pas partie de l'itinéraire, ou qui dépendaient du contrôleur et non de Twig.
Craig
13
Pour obtenir le chemin, essayez seulement {{ app.request.pathinfo }}ou voyez une liste des méthodes disponibles dans/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael
2
Cela devrait être la bonne réponse. Court et lisse.
Fabian Picone
2
uriobtient l'URL avec les paramètres. pathinfoobtient le chemin sans aucun paramètre. requestUriobtient le chemin AVEC les paramètres. requestUridevrait être ajouté à cette réponse IMO. Vous aurez rarement besoin du domaine et vous voudrez rarement supprimer les paramètres.
rybo111
115

Dans symfony 2.1, vous pouvez utiliser ceci:

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

Dans symfony 2.0, une solution est d'écrire une extension twig pour cela

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

Et utiliser comme ça

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

Vous n'aurez pas besoin de tout cela à moins que vous ne souhaitiez ajouter des paramètres supplémentaires à vos liens, comme dans un pager, ou que vous souhaitiez modifier l'un des paramètres.

Bártfai Tamás
la source
11
Si vous souhaitez générer le lien actuel dans Twig et modifier les paramètres régionaux pour le changement de langue, cela peut être fait dans Symfony 2.1 comme suit: {{path (app.request.attributes.get ('_ route'), app.request.attributes .get ('_ route_params') | merge ({'_ locale': 'ja'}))}} Cela peut fonctionner si vous utilisez l'extension Twig de Bártfai Tamás
Naytzyrhc
Pour votre implémentation 2.0, j'obtiens une erreur indiquant qu'il n'y a pas de conteneur. J'ai donc ajouté la variable comme cela se fait dans PagerfantaBundle, mais cela dit que je dois implémenter ContainerInterface?
Squazic
Vous devez créer un constructeur pour cette extension, qui a un paramètre $ container. Ensuite, dans la configuration DIC, vous devez déclarer le conteneur en tant que paramètre pour l'extension. Comme ici dans le TwigBundle
Bártfai Tamás
12
Les _route_parameters ne fonctionneront pas si vous avez des paramètres supplémentaires dans votre chaîne de requête. Vous pouvez utiliser app.request.query.all à la place.
wdev du
34

Vous pouvez obtenir l'URL actuelle dans Twig comme ceci:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
Zaheer Babar
la source
20

Il convient de noter que si vous avez des paramètres de requête supplémentaires dans votre URL, qui ne sont pas partie de l'itinéraire configuré, la réponse acceptée ne les inclura pas dans l'URL actuelle (chemin).

Pourquoi voudriez-vous des paramètres supplémentaires?

Par exemple, si vous avez une page de liste avec des enregistrements qui peuvent être filtrés par mot-clé et que la page a une pagination, il est fort probable que les variables de requête pour "mot-clé" et "page" ne seront pas dans votre itinéraire. Mais dans vos boutons avant et arrière pour la pagination, vous avez besoin de l'URL actuelle complète (qui contient les mots-clés pour que la page suivante soit toujours filtrée). Et vous devez modifier la variable de page.

Comment fusionner des paramètres de requête supplémentaires

Ainsi, vous pouvez obtenir l'itinéraire actuel et fusionner les variables supplémentaires (après avoir modifié une ou plusieurs de ces variables supplémentaires). Notez que vous fusionnez vos propres variables dans le app.request.query.all, puis que vous fusionnez ce tableau dans le app.request.attributes.get('_route_params'). La path()méthode nécessite que vous fournissiez tous les paramètres requis de l'itinéraire, c'est pourquoi vous devez inclure le _route_params.

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

C'est vraiment moche, mais si vous développez une pagination, vous devrez modifier la variable de page sur chaque lien séparé, vous devez donc inclure le tout à chaque fois. Peut-être que d'autres ont une meilleure solution.

Chadwick Meyer
la source
2
Probablement devrait être{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk
2

Si vous utilisez Silex 2, vous ne pouvez plus accéder à l'objet Request.

Vous pouvez accéder aux attributs de demande actuels de cette manière.

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

Et pour générer l'URL actuelle complète: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))

Tim
la source
Vous pouvez obtenir l'URL actuelle dans Brindille / Silex 2 comme ceci: global.request.attributes.get('_route'). Un pont Twig est requis.
dsoms le