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 valeur somePage
?
A partir de quelque chose qui est ContainerAware (comme un contrôleur):
$request = $this->container->get('request');
$routeName = $request->get('_route');
Avec Twig: {{ app.request.attributes.get('_route') }}
Je pense que c'est la manière la plus facile de faire ceci:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
Symfony 2.0-2.1
Utilisez ceci:
$router = $this->get("router");
$route = $router->match($this->getRequest()->getPathInfo());
var_dump($route['_route']);
Celui-ci ne vous donnera pas _internal
.
Mise à jour pour Symfony 2.2 +: Cela ne fonctionne pas à partir de Symfony 2.2+. J'ai ouvert un bug et la réponse a été "de par leur conception". Si vous souhaitez obtenir l'itinéraire dans une sous-action, vous devez le transmettre sous forme d'argument.
{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}
Et votre contrôleur:
public function menuAction($route) { ... }
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, , il retournera '_internal' pour les cas où la transmission 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é dans la version 2.4, mais cela se brisera support ESI:
$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
echo $masterRequest->attributes->get('_route');
}
Vous pouvez en faire une extension twig si vous en avez besoin dans les modèles.
_route
n'est pas la voie à suivre et ne l'a jamais été . Cela a toujours été fait pour le débogage selon Fabien qui a créé Symfony. Il n'est pas fiable car cela ne fonctionnera pas avec des opérations telles que le transfert et d'autres appels directs aux contrôleurs, tels que le rendu partiel.
Vous devez injecter le nom de votre route en tant que paramètre dans votre contrôleur, voir le doc ici
Aussi, 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és spécifique dont vous avez besoin (attributs, requête ou requête), donc $request->attributes->get('_route');
dans ce cas.
$request->attributes->get('_route');
Vous pouvez obtenir le nom de la route à partir de l'objet de requête à partir du contrôleur.
Tout ce que j'obtiens c'est _internal
Je reçois le nom de la route de l'intérieur d'un contrôleur avec $this->getRequest()->get('_route').
Même le code suggéré par tuxedo25 renvoie _internal
Ce code est exécuté dans ce que l'on appelait un "composant" dans Symfony 1.X; Pas un contrôleur de page, mais une partie d'une page qui nécessite une certaine logique.
Le code équivalent dans Symfony 1.X est: sfContext::getInstance()->getRouting()->getCurrentRouteName();
Avec Symfony 3.3, j’ai utilisé cette méthode et j’ai bien fonctionné.
J'ai 4 voies comme
admin_category_index, admin_category_detail, admin_category_create, admin_category_update
Et une seule ligne constitue une classe active pour tous les itinéraires.
<li {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
<a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
Pour obtenir l'itinéraire actuel basé sur l'URL (plus fiable en cas de transfert):
public function getCurrentRoute(Request $request)
{
$pathInfo = $request->getPathInfo();
$routeParams = $this->router->match($pathInfo);
$routeName = $routeParams['_route'];
if (substr($routeName, 0, 1) === '_') {
return;
}
unset($routeParams['_route']);
$data = [
'name' => $routeName,
'params' => $routeParams,
];
return $data;
}
Pour ceux qui ont besoin de la route actuelle pour Symfony 3, voici ce que j’utilise
<?php
$request = $this->container->get('router.request_context');
//Assuming you are on user registration page like https://www.yoursite.com/user/registration
$scheme = $request->getScheme(); //This will return https
$Host = $request->getHost(); // This will return www.yoursite.com
$route = $request->getPathInfo(); // This will return user/registration(don't forget this is registrationAction in userController
?>
Avec Symfony 4.2.7, je peux implémenter les éléments suivants dans mon modèle twig, qui affiche le nom de la route personnalisée que j'ai définie dans mes contrôleurs.
Dans index.html.twig
<div class="col">
{% set current_path = app.request.get('_route') %}
{{ current_path }}
</div>
Dans mon contrôleur
...
class ArticleController extends AbstractController {
/**
* @Route("/", name="article_list")
* @Method({"GET"})
*/
public function index() {
...
}
...
}
Le résultat affiche "article_list" sur la page souhaitée dans mon navigateur.