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?
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?
Réponses:
À 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') }}
<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:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
, où vous obtiendrez à nouveau la valeur '_internal'.
Symfony 2.0-2.1
Utilisez ceci:
$router = $this->get("router");
$route = $router->match($this->getRequest()->getPathInfo());
var_dump($route['_route']);
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
{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}
Et votre contrôleur:
public function menuAction($route) { ... }
$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 :
$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 de brindille si vous en avez besoin dans les modèles.
_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.
$request->attributes->get('_route');
Vous pouvez obtenir le nom de l'itinéraire à partir de l'objet de demande à partir du contrôleur.
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();
$view['request']->getParameter('_route');
{% render... %}
appels avec standalone=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
admin_category_index, admin_category_detail, admin_category_create, admin_category_update
Et une seule ligne crée 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 en fonction de 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;
}
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
<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 imprime "article_list" sur la page souhaitée dans mon navigateur.
Pour tous ceux qui ont besoin de l'itinéraire actuel 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
$name = $request->get('_route'); // This will return the name.
?>
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').
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
si vous voulez obtenir le nom de l'itinéraire en brindille, vous devez l'obtenir comme
{{ app.request.attributes.get('_route') }}
$request->get()
directement car il est lent: github.com/symfony/http-foundation/blob/2.8/Request.php#L712