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 de http://www.sitename.com/page
, je n'ai besoin que de /page
.
{{ path(app.request.attributes.get('_route'),
app.request.attributes.get('_route_params')) }}
Si vous voulez le lire dans une variable de vue:
{% set currentPath = path(app.request.attributes.get('_route'),
app.request.attributes.get('_route_params')) %}
La variable de vue globale app
contient toutes sortes de raccourcis utiles, tels que app.session
et app.security.token.user
, qui référencent les services que vous pourriez utiliser dans un contrôleur.
Obtenir RL actuelle: {{ app.request.uri }}
in Symfony 2.3, 3, 4
Obtenir chemin uniquement: {{ app.request.pathinfo }}
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 consiste à écrire une extension twig pour cette
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'}) }}
Tout cela ne sera nécessaire que si vous souhaitez ajouter des paramètres supplémentaires à vos liens, comme dans un pager, ou si vous souhaitez modifier l'un des paramètres.
Vous pouvez obtenir l'URL actuelle dans Twig comme ceci:
{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
Il est à noter que si votre URL contient des paramètres de requête supplémentaires, qui font pas partie de la route configurée, la réponse acceptée ne les inclura pas dans l'URL actuelle (chemin d'accès).
Par exemple, si vous avez une page de liste avec des enregistrements qui peuvent être filtrés par mot clé et que la page est paginée, il est fort probable que les variables de requête pour "mot clé" et "page" ne seront pas dans votre itinéraire. Toutefois, dans vos boutons Précédent et Précédent pour la pagination, vous avez besoin de l’URL actuelle complète (qui contient les mots-clés de sorte que la page suivante soit toujours filtrée). Et vous devez modifier la variable de page.
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 méthode path()
nécessite que vous fournissiez tous les paramètres requis de la route. 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 la pagination, vous devrez modifier la variable de page sur chaque lien, afin d'inclure le tout à chaque fois. Peut-être que d'autres ont une meilleure solution.
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 façon.
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'))