Comment obtenir l'itinéraire actuel dans Symfony 2?
Par exemple routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Comment puis-je obtenir cette somePage
valeur?
php
symfony
routing
symfony-routing
IlyaDoroshin
la source
la source
Avec Twig:
{{ app.request.attributes.get('_route') }}
la source
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
pour appliquer un CSS spécifique à une page :)Je pense que c'est la façon la plus simple de le faire:
la source
{% render "SomeBundle:SomeController:someAction" %}
, où vous obtiendrez à nouveau la valeur '_internal'.Symfony 2.0-2.1
Utilisez ceci:
Celui-là ne vous donnera pas
_internal
.Mise à jour pour Symfony 2.2+: cela ne fonctionne pas au démarrage de Symfony 2.2+. J'ai ouvert un bug et la réponse était "par conception". Si vous souhaitez obtenir l'itinéraire dans une sous-action, vous devez le passer en argument
Et votre contrôleur:
la source
$route['_route']
semble problématique, mais ce n'est peut-être pas le sujet de dev de symfony. Le livre de cuisine ne mentionne pas_route
de$router->match()
sortie ..$router->match()
dit "@return array Un tableau de paramètres" qui semble très interne. Je ne veux pas m'y fier, mais pour le moment, cela semble être la seule solution viable pour traiter les sous-demandes.Il n'y a pas de solution qui fonctionne pour tous les cas d'utilisation. Si vous utilisez la méthode $ request-> get ('_ route') ou ses variantes, elle renverra '_internal' pour les cas où le transfert a eu lieu.
Si vous avez besoin d'une solution qui fonctionne même avec le transfert, vous devez utiliser le nouveau service RequestStack, arrivé en 2.4, mais cela interrompra la prise en charge ESI :
Vous pouvez en faire une extension de brindille si vous en avez besoin dans les modèles.
la source
_route
n'est pas la voie à suivre et ne l'a jamais été . Il a toujours été conçu à des fins de débogage selon Fabien qui a créé Symfony. Il n'est pas fiable car il ne fonctionnera pas avec des choses comme le transfert et d'autres appels directs aux contrôleurs comme le rendu partiel.Vous devez injecter le nom de votre route comme paramètre dans votre contrôleur, voir la doc ici
De plus, veuillez ne jamais utiliser
$request->get('');
si vous n'avez pas besoin de la flexibilité, c'est beaucoup plus lent que d'utiliser get sur le sac de propriété spécifique dont vous avez besoin (attributs, requête ou demande), donc$request->attributes->get('_route');
dans ce cas.la source
Vous pouvez obtenir le nom de l'itinéraire à partir de l'objet de demande à partir du contrôleur.
la source
Tout ce que je retiens c'est
_internal
$this->getRequest()->get('_route').
J'obtiens le nom de la route depuis l'intérieur d'un contrôleur avec Même le code tuxedo25 suggère des retours_internal
Ce code est exécuté dans ce qui était appelé un «composant» dans Symfony 1.X; Pas le contrôleur d'une page mais une partie d'une page qui a besoin de logique.
Le code équivalent dans Symfony 1.X est:
sfContext::getInstance()->getRouting()->getCurrentRouteName();
la source
$view['request']->getParameter('_route');
{% render... %}
appels avecstandalone=true
. Lorsque la mise en cache (AppCache.php ou vernis avec ESI) est activée, les vues autonomes seront demandées avec une requête HTTP séparée (c'est là que la route_internal
entre en jeu) afin de pouvoir être mises en cache indépendamment.Avec Symfony 3.3, j'ai utilisé cette méthode et j'ai bien fonctionné.
J'ai 4 itinéraires comme
Et une seule ligne crée une classe active pour tous les itinéraires.
la source
Pour obtenir l'itinéraire actuel en fonction de l'URL (plus fiable en cas de transfert):
la source
Avec Symfony 4.2.7, je suis capable d'implémenter ce qui suit dans mon modèle de brindille, qui affiche le nom de route personnalisé que j'ai défini dans mes contrôleurs.
Dans index.html.twig
Dans mon contrôleur
Le résultat imprime "article_list" sur la page souhaitée dans mon navigateur.
la source
Pour tous ceux qui ont besoin de l'itinéraire actuel pour Symfony 3, voici ce que j'utilise
la source
si vous voulez obtenir le nom de la route dans votre contrôleur, vous devez injecter la demande (au lieu d'obtenir du conteneur en raison de Symfony UPGRADE et d'appeler get ('_ route').
si vous voulez obtenir le nom de l'itinéraire en brindille, vous devez l'obtenir comme
la source
$request->get()
directement car il est lent: github.com/symfony/http-foundation/blob/2.8/Request.php#L712