PRÉSENTATION DU COURS

Créer sa première route

Créer sa première route avec le framework symfony

Petits rappels avant de commencer

Structure MVC

Symfony utilise la structure MVC (Modèle, Vue, Controller), voilà un article qui explique cette notion en détail

N'hésitez pas à le lire si des mots comme "controller" ne vous évoquent rien.

Toujours pas de code ?

Créer un controller

Afin de créer notre première route, nous allons devoir créer un premier controller

Si on se rapelle bien, tout notre code se trouve dans le dossier src, et en l'occurence les controllers sont dans le dossier src/controllers.

Dans le dossier src/controllers créez le fichier ExempleController.php

voici la base du fichier sur laquelle nous allons travailler :

<?php

namespace App\Controller; // Nous ajoutons le namespace

class ExempleController // C'est important d'avoir le même nom pour la classe que dans le fichier
{
    // le reste du code sera ici
}

Comme vous pouvez le voir, nous sommes sur une classe très classique en php, car attention spoiler: Symfony c'est du php 😎

Ensuite, nous allons créer une petite méthode pour envoyer du texte à notre navigateur en guise de réponse.

Voilà le code :

<?php

namespace App\Controller; 

use Symfony\Component\HttpFoundation\Response; // Attention très important utilisez bien ce paquet sinon vous allez avoir une erreur

class ExempleController 
{
    
    public function index() {
        return new Response('Hello world !'); // Nous utilisons le paquet Response (obligatoire sinon erreur de symfony)
    }
}

Il est fortement conseillé d'utiliser PhpStorm pour développer sous Symfony, il gère l'auto complétion de vos imports et beaucoup de choses très intéressantes ! De plus il existe un plugin spécifique pour symfony, alors pourquoi s'en priver 😏

Ok ! C'est bon pour le controller.

Ok... mais mon site n'affiche pas "hello world", c'est bizzare non ?

Non c'est tout à fait normal, il nous manque une route !

Pour ceux qui se savent pas ce qu'est une route : C'est une url permettant d'accéder à une page spécifique de votre site. Généralement elles n'inclulent pas le domaine (type /route/v1/test), c'est ce qui permet à notre framework de répérer la page à afficher à l'utilisateur.

Le routing de manière classique

Dans symfony, le routing se gère par des fichiers yaml (.yml), et d'ailleurs pas que les routes !

Si vous allez dans votre dossier de configuration, vous allez trouver routes.yml, ouvrez le vous devriez trouver quelque chose comme ça :

#index:
#    path: /
#    controller: App\Controller\DefaultController::index

Attention le yaml est sensible à la position des éléments, faites donc attention à ce que vous tapez

Décommentez tout ça et remplacez DefaultController::index par ExampleController::index

Voilà à quoi ça devrait ressembler (avec quelques explications en plus)

index: # nom de votre route
    path: / # uri de votre route, ici ce sera la page principale
    controller: App\Controller\ExempleController::index # Controller et méthode gérant la route sous le schéma suivant : nomducontroller::nomdelaméthode

Parfait, désormais si vous accédez à votre site vous devriez voir Hello world s'afficher.

Mais comment ça marche ?

En réalité, il n'y a pas de magie ici tout est logique

Dans la définition de la route vous avez défini le controller, il est défini ici selon son namespace (Rappelez vous, ExempleController est dans le namespace App\Controller). Ensuite afin de définir la méthode à utiliser pour la route, elle est définie ici ::index, ceci représente la méthode à utiliser, dans notre cas c'est index.

Dans tous les cas, si vous entrez quelque chose de mauvais, vous aurez une belle erreur de la part de symfony, donc pas de panique !

Attention, dans le cas où vous avez deux fois le même path, seulement le premier sera pris en compte par symfony

Ceci est la méthode classique pour le routing de Symfony, pas forcément la plus pratique mais nous avons d'autres alternatives !

Le routing pour les personnes souhaitant une santé morale correcte

Une méthode alternative permettant de faire du routing est aussi disponible, celle ci étant généralement (des projet auxquels j'ai pu participer) la plus utilisée

Par contre, avant de pouvoir changer, nous devons installer un petit paquet.

Rendez vous dans votre console et tapez :

composer require annotations

Cela va installer les annotations pour notre projet, nous permettant de les utiliser !

Avant ça, nous allons de nouveau commenter entièrement notre fichier routes.yml, nous n'en aurons plus besoin.

Ensuite, rendez vous dans le controller, et nous pouvons désormais définir nos routes comme cela (n'oubliez pas le use) :

<?php

namespace App\Controller; 

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route; // Nouveau use pour les annotations

class ExempleController 
{
    /**
    * @Route("/")
    **/
    public function index() {
        return new Response('Hello world !'); 
    }
}

Pourquoi je préfère cette méthode

Ce qui est bien avec cette méthode, c'est que toutes les informations sont au même endroit, pas besoin de chercher la route et ensuite la méthode du controller, ici tout est ensemble.

Après, vous n'êtes pas obligé d'utiliser les annotations, mais dans ce cours nous allons les utiliser, donc vous devrez vous débrouiller avec la documentation pour répliquer le routing dans les fichiers yaml.

Arguments dynamiques dans l'url

Avoir des routes c'est bien beau, mais comment on passse un peu d'information pour que notre controller les récupères ?

Les choses étant bien faites, il vous suffit d'ajouter quelques éléments dans votre route de cette manière là :

<?php

namespace App\Controller; 

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ExempleController 
{
    /**
    * @Route("/")
    **/
    public function index() {
        return new Response('Hello world !'); 
    }

    /**
    * @Route("/saymyname/{name}")
    **/
    public function random($name) {
        return new Response('Hello ' . $name . ' !'); 
    }
}

Et maintenant si vous allez sur cette addresse : localhost:8000/saymyname/mistermv, ça devrait afficher ça :

Hello mistermv !

Vous pouvez de cette manière là faire passer autant arguments que vous le souhaitez dans votre route. Pour récupérer plus d'un argument, ajouter à votre fonction autant d'argument que de paramètres dynamique dans l'url (ceux comme {name}). Pensez bien que le premier argument de votre function, sera le premier paramètre dynamique dans la route associée, le second argument, sera le second paramètre dynamique, etc... jusqu'à que vous ayez tout récupéré !

Conclusion

Bravo à vous, vous avez mis en place votre première route !

Vous savez désormais comment créer un controller, lui associer une route, passer des paramètres au controller et faire fonctionner les deux ensemble !

Envie de discuter du contenu ?

logo twitter @GarnierKristen