Symfony 2 - Premiers pas avec le routing et les contrôleurs

Notre framework et ses bundles sont prêts à être utilisés. Essayons maintenant de créer une page d'accueil basique à l'aide du contrôleur et du routing.




Le routing dans Symfony2


Commençons tout d'abord par la gestion du routing dans notre application.

Qu'est-ce que le routing ?



Symfony intègre un système de routing permettant d'interpréter une URL et en déduire l'action et donc la page à afficher.
C'est un système très puissant qui nous permettra de gérer tous les liens internes du projet.
Le routing nous permet aussi de gérer facilement des URLs plus parlantes et de savoir à quelle action et donnée elle correspond. (URL rewriting etc.)

Pour comprendre comment fonctionne le routing dans Symfony, voici un petit schéma qui explique globalement le processus de traitement d'une requête HTTP:

Schéma de fonctionnement du traitement d une requête HTTP par Symfony2


1) Votre requête HTTP est reçue directement par le contrôleur frontal (app.php ou app_dev.php) qui va initialiser le kernel Symfony (Le cœur du système).

2) Le kernel récupère l'URI et la transmet au système de routing.

3 & 4) Le système de routing interprète l'URI et détermine le contrôleur et l'action adéquate. Il permet aussi de récupérer les paramètres pour traiter le bon objet. (Exemple: l'ID de notre bureau à afficher).

5) Le kernel initialise le contrôleur déterminé par le routing: DeskController.php

6) Le contrôleur exécute l'action showAction en lui passant en paramètre l'ID du bureau à afficher.

7) Le résultat est retourné à l'utilisateur.

Le processus est volontairement simplifié, en réalité, le mécanisme est plus complexe, mais l'idée derrière est celle là.


Le routing dans Symfony2



Hugo Hamon présente Symfony2 et le routing au Web Event de la Ferme du Web 2011


Si vous connaissez le fonctionnement du routing dans Symfony 1.x, vous ne devriez pas être trop perdu.
Les principaux changements sont:

  • Les différents formats possibles pour gérer le routing: YAML, XML, PHP, Annotations...
  • Le passage des paramètres dans l'URL mappés à l'action du contrôleur.[/item[item]"L'héritage" des fichiers de routing / délégation à un bundle...


Le fichier de configuration principal du routing se trouve dans app/config/routing.yml (ou routing_dev.yml pour l'environnement de développement).
Par défaut, en générant notre Bundle, vous devriez avoir la configuration suivante:
Code:
WmdWatchMyDeskBundle:
    resource: "@WmdWatchMyDeskBundle/Controller/"
    type:     annotation
    prefix:   /


L'instruction ci-dessus dit à Symfony qu'il faut interpréter les routes directement dans les annotations des contrôleurs du bundle WmdWatchMydeskBundle.

Les annotations sont des instructions ajoutées en commentaires devant les classes, méthodes et variables de nos classes PHP. Exemple: @Route("/show/{deskId}", name="desk_show")



Si l'on regarde les fichiers dans le répertoire src/Wmd/WatchMyDeskBundle/Controller/, vous remarquerez un fichier DefaultController.php. Il s'agit du contrôleur par défaut de notre Bundle, généré automatiquement avec la console.

Code php:
class DefaultController extends Controller
{
    /**
     * @Route("/hello/{name}")
     * @Template()
     */
    public function indexAction($name)
    {
        return array('name' => $name);
    }
}


A l'intérieur, on trouve l'action indexAction qui prend en paramètre une variable $name.
Si vous regardez dans les fameuses annotations juste au dessus de l'action, vous verrez qu'une route est définie: @Route("/hello/{name}").
Elle signifie que nous allons exécuter l'action index lorsqu'un utilisateur se connectera sur l'URL /hello/votreNom.
Vous pouvez essayer sur votre projet en passant votre nom en deuxième paramètre, vous devriez obtenir la page suivante:

Hello


En spécifiant le paramètre {name} dans la route, le système de routing va chercher la variable $name dans les paramètres de l'action (peu importe l'ordre des variables s'il y'en a plusieurs) et la charger avec la valeur spécifiée dans l'URL.

Une nouveauté bien pratique par rapport aux version 1.x !


Affichage de la homepage de notre site


A présent, nous allons modifier l'action pour afficher la page d'accueil de notre projet:

Code php:
class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     * @Template()
     */
    public function indexAction()
    {
        return array();
    }
}


L'action ne prend plus de paramètres car il s'agit de la page d'accueil du site. Si vous tentez d'appeler la page d'accueil à présent, vous aurez un message d'erreur car il faut que l'on modifie le template associé.

Ouvrez le fichier index.html.twig dans src/Wmd/WatchMyDeskBundle/Resources/views/Default et changez le contenu:
Code html:
Bienvenue sur Watch My Desk !


En théorie, vous allez de nouveau tomber sur l'accueil de l'environnement de développement de Symfony2.
Nous allons à présent supprimer le Bundle Acme qui ne sert que de démo pour bien démarrer.


  • 1) Supprimez le répertoire src/Acme

  • 2) Supprimez la ligne de chargement du bundle Acme "$bundles[] = new AcmeDemoBundleAcmeDemoBundle();" dans app/AppKernel.php

  • 3) Supprimez les 3 premières routes dans le fichier routing_dev.yml:
Code:
_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Welcome:index }

_demo_secured:
    resource: "@AcmeDemoBundle/Controller/SecuredController.php"
    type:     annotation

_demo:
    resource: "@AcmeDemoBundle/Controller/DemoController.php"
    type:     annotation
    prefix:   /demo


Rendez-vous sur la page d'accueil de votre site:
Page accueil du projet


Vous remarquerez que le profiler ne s'affiche pas sur notre page. C'est normal, il faut que l'on définisse un layout avec les balises de structure HTML. Sans body, il ne s'affiche pas.



A tout moment, vous pouvez contrôler les routes que Symfony a bien enregistré en tapant la commande:
php app/console router:debug


Liste des routes gérées par notre projet




Les contrôleurs dans Symfony2


Les contrôleurs sont stockés dans le répertoire Controller/ de nos bundles.

Tous les contrôleurs doivent suivre la convention de nommage suivante: NomController.php
Automatiquement, les vues par défaut du contrôleur se situeront dans le répertoire Resources/views/Nom/. Le choix du nom du contrôleur a donc un impact certain sur le reste.

La question que vous allez vous poser maintenant, c'est comment séparer la partie Frontend et Backend de notre site.
Contrairement à Symfony 1.x, nous n'avons plus de système d'applications. Il vous suffit de créer un répertoire Controller/Back/ et Controller/Front/ par exemple qui permettra de stocker les contrôleurs dédiés à ces deux parties.

Attention, dans ce cas, veillez bien à modifier les namespaces de vos contrôleurs, et changer le routing.yml pour faire pointer sur ces répertoires. Il faudra aussi ajouter un répertoire Back/ et Front/ dans le Ressources/views/ de votre bundle.



Dans notre tutoriel, ayant que très peu de fonctions d'administration, nous mélangerons admin et front dans les mêmes contrôleurs (c'est tout à fait possible).

Code php:
    /**
     * @Route("/", name='homepage')
     * @Template()
     */
    public function indexAction()
    {
        return array();
    }


L'annotation @Template permet de spécifier que l'action est directement liée à un template. Si rien n'est défini entre parenthèse, le template utilisé par défaut sera situé dans src/Wmd/WatchMyDeskBundle/Resources/views/NomContrôleur/nomAction.html.twig. Dans notre cas index.html.twig.

Dans une action, il faut toujours renvoyer une réponse avec l'objet Symfony\Component\HttpFoundation\Response:
Code php:
public function indexAction()
{
    return new Response('<html><body>Salut les fermiers !</body></html>');
}


Dans le cas ci-dessus, le template n'est pas utilisé.

Pour rendre un template spécifique avec des paramètres:

Code php:
return $this->render('WmdWatchMyDeskBundle:Default:index.html.twig', array('name' => "DJo"));


Ou de manière raccourcie, si l'annotation @Template est utilisée:
Code php:
return array('name' => "DJo");


C'est cette dernière méthode que nous utiliserons (pour sa simplicité).


Voilà pour la base pour les contrôleurs, nous verrons comment aller plus loin tout au long du tutoriel.
Prochaine étape, les vues avec le moteur de templates Twig.





Rechercher sur la Ferme du web