• 12 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 16/05/2024

Affichez une page en fonction d'une requête

Comprenez les routes

Nous avons installé Symfony, nous avons vu comment fonctionnait le protocole HTTP, et nous avons vu comment il se traduisait dans Symfony. Nous allons donc mettre en pratique, et permettre à Biblios de renvoyer des pages statiques. Cela nous permettra d’avoir au moins une page d’accueil prête à montrer à notre client.

Nous allons donc nous servir des routes et controllers. Ces routes et controllers sont les objets qui vont servir d’intermédiaires entre vous, la requête et la réponse. Nous allons faire correspondre une requête à une route, et nous servir d’un controller pour renvoyer la réponse.

D’accord, mais pourquoi a-t-on besoin de ces routes et controllers ?

Nous allons en fait définir une liste de routes, et chaque route correspondra à une action qu’il est possible d’effectuer sur notre application. Ainsi, lorsqu’une requête arrive sur notre application, si elle ne correspond à aucune route enregistrée par nos soins, une réponse d’erreur sera retournée pour dire que la ressource n’a pas été trouvée (avec un code… 404, vous avez deviné).

Si la requête correspond à une de nos routes en revanche, il faudra y répondre correctement. C’est pour cela que nos routes seront associées à des controllers.

Et donc comment ça fonctionne, une route ?

Tout d’abord, sachez que vous pouvez créer vos routes de plusieurs façons. Elles peuvent être définies grâce à plusieurs formats : dans des fichiers YAML, dans des fichiers XML, en simple PHP, ou grâce à des attributs PHP sur vos controllers. Cette dernière façon de faire est celle préconisée dans la documentation officielle, et c’est celle que nous allons utiliser.

En premier lieu, une route est définie par plusieurs choses, dont deux sont obligatoires : un nom, qui doit lui être unique dans l’application, et un chemin, qui est la ressource à laquelle la requête doit correspondre. En situation, cela donne à peu près cela :

<?php
// …
use Symfony\Component\Routing\Attribute\Route;

class SomeController extends AbstractController
{
    #[Route(‘/some-page’, name: ‘app_some_page’)]
    public function somePage(): Response
{
// …

Euh, je croyais qu’on parlait des routes, et là je vois un truc qui s’appelle “controller”.

Pour l’instant, ne prêtez pas attention à tout ce qui tourne autour du controller, et concentrez-vous sur l’attribut de Route.

En haut de l’extrait de code, vous avez la classe à laquelle appartient l’attribut de Route. Vous avez ensuite un exemple de son utilisation, avec les deux arguments minimaux. Désormais, si une requête atteint notre application en demandant la ressource  /some-page  , cette route renverra une correspondance et la méthode située juste en dessous, le controller sera appelé. 

Un premier exemple d’option disponible : restreindre les méthodes HTTP auxquelles votre route répondra. Vous pouvez le faire en ajoutant un argument nommé  methods  à votre attribut de route. Cet argument est un array dans lequel vous mettrez la ou les méthodes autorisées par votre route. Par exemple :

<?php
#[Route(‘/some-page’, name: ‘app_some_page’, methods: [‘GET’])]

Renvoyez une réponse avec les Controllers

Vous avez un exemple de controller un peu plus haut, maintenant il est temps de leur donner une définition plus précise. Sébastien vous formule cette définition de la manière suivante :

Un controller est un callable qui renvoie une réponse.

Euh… Ça veut dire quoi ça, exactement ?

Parlons d’abord du mot “callable”. Ce mot désigne un type utilisable en PHP. Vous pouvez typer des propriétés, des arguments ou des retours de fonction avec ce type. Pour faire simple, ce type désigne tout ce qui peut être appelé par PHP : fonction anonyme, nom de fonction, méthode au sein d’une classe, classe disposant d’une méthode  __invoke  ...

Très concrètement, la plupart du temps, sinon tout le temps, vous allez créer des classes de controllers, comme dans l’exemple  SomeController  plus haut. Il y a quelques règles et conventions à respecter pour que vos controllers fonctionnent facilement : 

  • Premièrement, vos classes de controllers doivent se trouver dans le dossier  src/Controller  et avoir un nom qui se termine par  Controller  . Par exemple,  src/Controller/SomeController.php  contenant la classe  App\Controller\SomeController  .

  • Deuxièmement, vos classes de controllers doivent étendre la classe  Symfony\Bundle\FrameworkBundle\Controller\AbstractController  . Cette classe vous donne accès à tout un tas de raccourcis très utiles, ainsi qu’à des fonctionnalités qui vous faciliteront grandement la vie.

  • Enfin, si vous voulez vraiment avoir une application claire, facile à maintenir et à garder organisée, il est très fortement conseillé de garder vos classes de controllers les plus courtes possibles. Ne mettez dedans qu’un nombre limité de routes avec leurs controllers, et ne mettez que le strict minimum de logique dans ces controllers.

Comme le disait la définition du controller : son rôle est de renvoyer une réponse. Rien d’autre. Ce sera facile au début, moins par la suite, mais nous verrons tous les outils qui peuvent nous y aider.

Tirez parti de MakerBundle

Maintenant que nous savons comment fonctionne un controller, il va être temps d’en créer un. Mais d’abord, laissez-moi vous présenter votre nouveau meilleur ami : MakerBundle.

Commencez par ouvrir un terminal dans le dossier de votre application. Nous allons commencer par tester les capacités de la console Symfony. Pour savoir tout ce que vous pouvez faire dans votre application, entrez la commande suivante :

symfony console list

Cette commande vous permet d’afficher toutes les autres commandes actuellement disponibles dans votre application. Si vous regardez bien, certaines sections sont délimitées par des mots clés. Vous pouvez les utiliser comme argument supplémentaire de la commande  list  afin de limiter les résultats à cette section seulement. Essayez avec les commandes du MakerBundle :

symfony console list make

Vous avez ici la liste de toutes les commandes du MakerBundle. Chacune de ces commandes vous permettra de créer un ou plusieurs fichiers, préremplis avec le code dont vous avez besoin, ou des exemples d’utilisation.

Créez un Controller avec MakerBundle

Dans cette liste se trouve une commande dont nous allons nous servir :  make:controller  . Cette commande va vous permettre de créer rapidement et facilement le squelette de vos classes de controllers, ainsi qu’un exemple de route. Bien sûr, vous pouvez aussi le faire à la main, mais cette façon de faire est plus rapide.

Lorsque vous entrez la commande, vous avez le choix : soit vous lui fournissez directement le nom de la classe de controller que vous souhaitez créer, soit la commande vous le demandera interactivement ensuite. Par exemple, la commande :

symfony console make:controller

produira le résultat suivant dans la console :

Résultat dans la console
Résultat dans la console

Comme vous le voyez, deux fichiers ont été créés. Nous ne nous intéresserons pas à celui du dossier template pour l’instant. Regardons plutôt le contenu du controller.

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class AwesomeController extends AbstractController
{
    #[Route('/awesome', name: 'app_awesome')]
    public function index(): Response
    {
        return $this->render('awesome/index.html.twig', [
            'controller_name' => 'AwesomeController',
        ]);
    }
}

Comme vous le voyez, nous avons une classe qui étend  AbstractController  . Et cette classe contient une fonction (donc du type  callable  ) qui renvoie un objet de la classe  Response  et qui est associée à une route. Laissez de côté l’appel à  $this->render()  pour l’instant. Tout ce que vous avez besoin de savoir est qu’il nous permet de renvoyer la Response avec du HTML dedans.

D’ailleurs, si vous vous rendez sur votre navigateur et que vous vous rendez surhttps://127.0.0.1:8000/awesome  , vous verrez s’afficher la page suivante :

Affichage de la page AwesomeController
Affichage de la page AwesomeController

Notez dans la barre du Profiler que le code de réponse est désormais  200 OK  . Tout s’est bien passé, nous avons associé une requête avec une route et un controller, qui a renvoyé une réponse !

À vous de jouer

Contexte

Il est temps de donner enfin sa première véritable route à notre application ! À l'heure actuelle, nous n'avons toujours pas de page d'accueil, et Amélie aimerait bien avoir au moins ça pour annoncer l'ouverture prochaine de la plateforme. Vous allez donc commencer par en créer la logique.

Consignes

Nous allons créer une classe de controller, dans laquelle nous devrons retrouver une route pour la page d’accueil du site (chemin :   ’/’  ).

Choisissez le nom de cette classe comme bon vous semble, mais si vous souhaitez des exemples, deux noms classiques pourraient être “MainController” ou “DefaultController”.

En résumé

  • Les routes sont un moyen d’autoriser certaines requêtes dans notre application.

  • Les routes doivent avoir un chemin auquel faire correspondre les requêtes, et un nom unique.

  • Les routes sont associées à des controllers, qui sont chargés de renvoyer une réponse.

  • Vous pouvez facilement créer des fichiers comme les classes de controller grâce au MakerBundle.

Maintenant que nous avons des routes et des controllers, personnalisons un peu les pages renvoyées grâce à Twig dans le chapitre suivant !

Exemple de certificat de réussite
Exemple de certificat de réussite