Développement d'un site e-commerce avec Symfony 6

Développement d'un site e-commerce avec Symfony 6

Episode 4 : Définir une route depuis le contrôleur et route avec paramètre

Bonjour les amis, bienvenue dans l'épisode 4 de la série Développement d'un site e-commerce avec Symfony 6.

Dans l'épisode 3 nous avons découvert l'écriture des routes en yaml. Créer une route depuis un fichier yaml qui pointe vers une méthode du contrôleur est quelque chose d'assez simple et utile à connaitre. Mais laissez-moi vous dire qu'il existe deux autres façons de le faire encore plus simple depuis un contrôleur. Et c'est la méthode recommandée par Symfony de le faire, et c'est très simple à comprendre. Il s'agit des :

  • attributs :

C'est une fonctionnalité nouvelle apparue dans la version 8 de Php. En fait, les attributs sont des métadonnées qui peuvent être ajoutées à une classe, une fonction, une méthode ou une propriété.

Si vous être davantage intéressé par le sujet, vous pouvez regarder ici

  • annotations:

C'est également une fonctionnalité qui permet de faire la même chose que les attributs PHP, sauf que les annotations ne sont pas natives en PHP. Pour les utiliser il va falloir qu'on installe le support des annotations.
Avant d'aller loin, commençons par installer le support des annotations. Pour cela ouvrons notre terminal ou invite de commande à la racine du projet et tapons la commande.

composer require annotations

Si vous vous souvenez lors de l'épisode 2, nous avons dis composer nous permettait par exemple d'installer les dépendances.
Ainsi, la commande suivante, nous a permis d'installer notre première dépendance du projet. Cela signifie que désormais, le projet en cours a une bibliothèque qui ajoute les fonctionnalités à notre projet.
Essayons de voir tous ce que cette commande a fait pour nous :

  • le fichier composer.json a été modifié.
    Pour voir ce qui a été ajouter, vous pouvez utiliser une commande git. Pour cela, taper à la racine du projet dans un terminal la commande suivante:
git diff composer.json

Regardez ce que moi j'obtiens après avoir tapé la commande.

Screen Shot 2022-02-02 at 23.40.57.png

En regardant bien cette image, on remarque un signe plus ( +) devant la ligne "sensio/framework-extra-bundle": "^6.2", qui est en vert.
C'est de cette façon git nous indique ce qui a été modifié dans un fichier. Il se peut que si vous le faite chez vous, que vous puissiez voir d'autres lignes avec des + en vert, cela s'explique simplement par le fait que depuis que vous me suivez nous n'avons faits aucun commit. Mais je l'ai fais chez moi.
Ainsi la ligne en verte, a été ajouté dans la section require du fichier composer.json, il s'agit donc d'une dépendance dont a besoin notre projet.
Si un sujet sur git vous intéresse, laissez-moi un message en commentaire de cet article et je vous ferais avec plaisir un petit tutoriel pour bien comprendre et apprehender le fonctionnement de git.

  • le fichier config/bundles.php a été modifié également:
    Nous faisons comme précédemment pour voir les modifications apportées:
git diff config/bundles.php

Screen Shot 2022-02-03 at 00.05.56.png

La ligne Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], a été ajouté au fichier. La fin de cette ligne(all => true) montre que la bibliothèque est activée pour tous les trois environnement de symfony (dev, test, prod).

  • le fichier config/routes/annotations.yaml a été ajouté. Voyons son contenu:

Screen Shot 2022-02-03 at 00.17.34.png.

C'est un fichier de configuration pour les annotations, cela indique a Symfony de rechercher les routes définies comme annotations dans n'importe quelle classe PHP stockée dans le dossier src/Controller/. Regardons juste l'intérieur, mais ne modifions rien.

  • le fichier config/packages/sensio_framework_extra.yaml a aussi été ajouté.
    Voyons juste son contenu également

Screen Shot 2022-02-03 at 00.20.35.png

Mais comment est-ce que moi je fais pour savoir tout ce qui a été modifié ou ajouté après un composer require ? Deux réponses pour le savoir:

  • je fais un commit avant l'installation.
    une fois l'installation terminée je tape dans le terminal la commande git suivante :
git status
  • symfony nous donne toujours un retour après une commande tapée.
    Regardons un peu le retour que j'ai obtenu en faisant composer require annotations

Screen Shot 2022-02-03 at 01.02.12.png

En fait, les amis, ce que j'ai envie que vous comprenez c'est que á chaque fois que vous faites composer require nombibiotheque, beaucoup de choses changent dans votre projet (des fichiers sont modifiés, puis ajoutés en fonction de la bibliothèque installé.
Donc il est très important que vous sachiez ce que vous faites afin de ne pas laisser le framework vous contrôler à sa guise.

Nous voici, ayant installer notre bibliothèque d'annotations, allons dans notre controller DefaultController.php pour l'utiliser et pour cela créons une nouvelle méthode new.

    /**
     * @Route("/new")
     */
    public function new()
    {
       return new Response('Ajouter contenu ici!');
    }

Le code écrit en haut de public est une annotation, ca ressemble à un commentaire, contrairement a un commentaire qui est souvent ignoré, l'annotation est interprétée et c'est bien un code valide.
Pour que le code suivant puisse marcher, il faudrait importer obligatoirement l'annotation Route du bon namespace en haut du fichier. Ainsi la ligne suivante doit être ajoutée en haut de la classe :

use Symfony\Component\Routing\Annotation\Route;

Si les choses semble floues, je vous donne le contenu complet de mon fichier DefaultController.php

<?php

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route; // Importation de l'annotation Route

class DefaultController
{
    public function index()
    {
        return new Response('Ma superbe page avec symfony!');
    }

    /**
     * @Route("/new")
     */
    public function new()
    {
       return new Response('Ajouter contenu ici!');
    }

}

Si notre serveur est éteint actuellement, lançons le et regardons à l'adresse 127.0.0.1:8001/new

symfony serve

Si tout a été bien fait, vous verrez afficher dans le navigateur Ajouter contenu ici!. Vous venez ainsi de créer votre page en utilisant l'annotation Route.

Créons ensuite une nouvelle page en utilisant les attributs php (Annotation native). Pour cela, rendez vous dans notre controller DefaultController.php et ajoutons une méthode disbonjour(), sauf que cette fois, notre méthode va prendre en paramètre un nom, et notre travail va consister à dire bonjour au nom passer en paramètre de la méthode.

    #[Route('/bonjour/{nom}')]
    public function disBonjour($nom)
    {
       return new Response('Bonjour '.$nom);
    }

Le code écrit en haut de public est un attribut php. En effet, un attribut php commence par un dièse (#), suivie des crochets ([]).
Ici, nous définissons une route(URL) /bonjour, cette url utilise un paramètre nom, presence de {nom}, le paramètre passé dans l'URL doit donc être récupérer depuis la méthode exécutée lors de l'appel de cette URL, c'est cela qui explique le paramètre $nom de la méthode disBonjour().
Ensuite cette méthode renvoie une réponse comme toute les méthodes contrôleurs de Symfony.

Donc on peut définir des routes avec des paramètres variables. pour cela il suffit d'envelopper les paramètres avec{}

Essayons de passer le paramètre Patrice à notre route et observons le résultat.

Screen Shot 2022-02-03 at 02.21.08.png

Changer successivement le paramètre patrice, par autre nom de votre choix et observer comment la page se met ajout en fonction du paramètre passer à l'URL.

Pour ceux d'entre vous qui ne se sont pas retrouvé voici le fichier complet qui clôt ce quatrième épisode.

<?php

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route; // Importation de l'annotation Route

class DefaultController
{
    public function index()
    {
        return new Response('Ma superbe page avec symfony!');
    }

    /**
     * @Route("/new")
     */
    public function new()
    {
       return new Response('Ajouter contenu ici!');
    }

    #[Route('/bonjour/{nom}')]
    public function disBonjour($nom)
    {
       return new Response('Bonjour '.$nom);
    }

}

Nous voici à la fin du quatrième épisode, j'espère que vous aviez vraiment compris ce système de route en annotation ou attribut, pour la suite je l'utiliserai beaucoup.

Pour le moment nous commençons à avoir beaucoup de routes, et aussi dans la partie des routes en yaml nous avons vu qu'une route avait forcément un nom. Mais pourquoi n'avons-nous pas donné de nom en utilisant les annotations ou les attributs?

Dans le prochain épisode nous rentrerons plus en profondeurs dans le système de route de symfony. Dès lors portez-vous bien!