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.
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)
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.
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.
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.
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:
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.
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.
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'))
{{ app.request.getBaseUrl ~ app.request.getPathInfo }}
(legetBaseUrl
bit est facultatif; seulement nécessaire s'il n'est pas installé à la racine du domaine)Réponses:
Si vous souhaitez le lire dans une variable de vue:
La
app
variable de vue globale contient toutes sortes de raccourcis utiles, tels queapp.session
etapp.security.token.user
, qui référencent les services que vous pouvez utiliser dans un contrôleur.la source
Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Obtenir l'url actuelle :
{{ app.request.uri }}
dans Symfony 2.3, 3, 4, 5Obtenir le chemin uniquement :
{{ app.request.pathinfo }}
(sans paramètres)Obtenir l' URI de la demande :
{{ app.request.requesturi }}
(avec les paramètres)la source
{{ app.request.pathinfo }}
ou voyez une liste des méthodes disponibles dans/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
uri
obtient l'URL avec les paramètres.pathinfo
obtient le chemin sans aucun paramètre.requestUri
obtient le chemin AVEC les paramètres.requestUri
devrait être ajouté à cette réponse IMO. Vous aurez rarement besoin du domaine et vous voudrez rarement supprimer les paramètres.Dans symfony 2.1, vous pouvez utiliser ceci:
Dans symfony 2.0, une solution est d'écrire une extension twig pour cela
Et utiliser comme ça
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.
la source
Vous pouvez obtenir l'URL actuelle dans Twig comme ceci:
la source
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 leapp.request.attributes.get('_route_params')
. Lapath()
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.
la source
{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
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.
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'))
la source
global.request.attributes.get('_route')
. Un pont Twig est requis.