- Ne souhaiter bonjour qu'à monsieur Fournier est un peu limité...
- Pour gérer les URLs du type
/HelloWorld/mister/*
les routes peuvent être dynamiques :
/**
* @Route("HelloMister/{lastName}")
*/
- Le controleur associé pourra utiliser ce paramètre facilement :
public function HelloMisterLastNameAction() {
return $this->render('HelloWorld/mister.html.twig', array('mister' => $lastName));
}
- Identifier les routes permettrait de les réutiliser (dans des liens hypertextes par exemple)
/**
* @Route("HelloMister/{lastName}", name="bonjour")
*/
- Charge à un contrôleur de génerer ces liens :
/**
* @Route("HelloMister")
*/
public function HelloMistersAction() {
$misters = array ("Amanton", "Arfi", "Balev", "Bertelle", "Duvallet", "Fournier", "Jay", "Mermet", "Pigne", "Ponty");
$urls = array();
foreach ($misters as $mister) {
$urls[] = $this->generateUrl('bonjour', array('lastName' => $mister));
}
return $this->render('HelloWorld/misters.html.twig', );
}
- Et au template
twig
de les afficher :{# app/Resources/views/HelloWorld/misters.html.twig #}
<h1>Liste des misters !</h1>
<ul>
{% for mister in misters %}
<li><a href="{{ path('bonjour', {'lastName': mister}) }}"> {{ mister }} </a></li>
{% endfor %}
</ul>
<ul>
{% for url in urls %}
<li><a href="{{ url }}"> {{ url }}</a></li>
{% endfor %}
</ul>
- Il n'y a plus besoin de connaître en détail les URLs de notre site !
- Twig permet de programmer simplement et efficacement les réponses de notre serveur
- Rien n'empêche d'avoir plusieurs paramètres par route :
/**
*
*/
public function HelloTitleAction($title, $lastName) {
return $this->render('HelloWorld/title.html.twig',
array('title' => $title, 'lastName' => $lastName));
}
{# app/Resources/views/HelloWorld/title.html.twig #}
<h1>Hello {{ title }} {{ lastName }} !</h1>
- Comment gérer les risques de conflits entre les routes ? Par exemple, si on a simultanément :
/**
* @Route("Route/{number}")
*/
public function routeNumberAction($number) {
$number *= 5;
return new Response("Route $number !
");
}
/**
* @Route("Route/{name}")
*/
public function routeNameAction($name) {
return new Response("Route $name !
");
}
Par défaut c'est la première route qui est appariée, donc les routes associées à une chaîne de caractères vont produire une erreur.
- Comment filtrer les routes avec un expression rationnelle (RegExp) ? simplement en ajoutant un descripteur requirements dans l'annotation :
/**
* @Route("Route/{number}", requirements={"number"="\d+"})
*/
public function routeNumberAction($number) {
$number *= 5;
return new Response("Route $number !
");
}
Ici un seul requirements suffit, la route associée à un nom sera exécutée si aucune route numérotée n'est visée.