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::indexAttention 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éthodeParfait, 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 annotationsCela 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 !