L3 Info : PHP et Applications Web
 
◃  Ch. 11 Some old Stuff (chapitre non maintenu)  ▹
 

Les routes paramétrables et nommables

  • 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($lastName) {
            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', array( 'urls' => $urls, 'misters' => $misters));
    }
  • 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 :
    /**
     * @Route("HelloTitle/{title}/{lastName}")
     */
    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.