Centre d'aide au développement d'applications web avec Symfony

Affichons une liste des produits d'une requête SQL

Mis à jour le 16/01/2022

Création de la table des catégories

Comme dans le précédent chapitre, nous allons utiliser la commande suivante : 
symfony console make:entity

Après avoir saisi le terme categorie, suivez ces prochaines instructions.
New property name (press <return> to stop adding fields):
Nous allons créer un seul champ, celui du titre. Saisissez donc titre puis validez.

Field type (enter ? to see all types) [string]:
Utilisons la valeur par défaut, à savoir le type string.

Field length [255]:
Validez pour confirmer votre choix pour une longueur maxi de 255 caractères.

Can this field be null in the database (nullable) (yes/no) [no]:
Validez deux fois pour confirmer votre choix et pour sortir de l'assistant.

Mise en relation entre deux tables

Afin d'optimiser les requêtes sur la base de données, nous allons créer une relation entre nos deux entités (nos deux tables). Pour cela nous allons modifier la table "produit".
Entrez cette commande dans le terminal : 
symfony console make:entity

Class name of the entity to create or update (e.g. VictoriousKangaroo):
Lorsqu'on vous demande si vous voulez créer une entité ou mettre à jour une entité existante, saisissez produit

New property name (press <return> to stop adding fields):
Saisissez alors categorie

Field type (enter ? to see all types) [string]:
Maintenant, nous allons changer de type pour ce champ. Tapez relation et validez.

What class should this entity be related to?:
On nous demande à quelle table doit être reliée la table des produits. Entrez Categorie et soyez attentif à la casse.

Relation type? [ManyToOne, OneToMany, ManyToMany, OneToOne]:
Choisissez le type ManyToOne et validez votre choix.

Is the Produit.categorie property allowed to be null (nullable)? (yes/no) [yes]:
Sélectionnez no et validez. Ensuite, validez toutes les autres options jusqu'à ce que vous sortiez du programme de mise à jour des entités.

Effectuer la migration

Comme pour la table des produits, nous allons devoir maintenant mettre à jour notre base de données avec notre nouvelle entité et sa relation sur la table des catégories.
Nous allons donc respecter le protocole suivant en entrant ces commandes une à une.
symfony console make:migration
symfony console doctrine:migrations:migrate

Vous devrez confirmer votre choix. Si vous voulez exécuter une migration spécifique, vous pouvez taper ceci :
symfony console doctrine:migrations:execute 'DoctrineMigrations\Version12345678901234'
Remplacez les chiffres par la ceux qui correspondent à votre projet. Vous trouverez cette information dans le fichier de migration lui-même. Vous devrez confirmez dans votre terminal en validant.

Insertion SQL de six produits

Nous verrons dans cette étape comment lister les produits d'une catégorie issus d'une base de données. Pour cela, nous allons insérer 2 exemples dans notre table des catégories. Nous ajouterons ensuite 3 exemples de produits par catégorie. Saisissez ces commandes l'une après l'autre afin d'ajouter 2 nouvelles catégories :
symfony console doctrine:query:sql "INSERT INTO categorie (titre) VALUES ('catégorie 1')"
symfony console doctrine:query:sql "INSERT INTO categorie (titre) VALUES ('catégorie 2')"

Nous pourrions exécuter les mêmes commandes pour insérer nos 6 produits (3 par catégorie), mais nous allons voir ici une autre méthode.
Nous allons utiliser un fichier de migration. Pour cela, saisissez cette commande qui créera un nouveau fichier dans votre dossier /migrations
symfony console doctrine:migrations:generate

Il vous suffit de modifier ce fichier pour exécuter une nouvelle migration. Faites un "copier-coller" de la "function up" ci-dessous.

public function up(Schema $schema): void
    {
        // this up() migration is auto-generated, please modify it to your needs
        // Le dernier chiffre correspond à l'identifiant de la catégorie. Modifiez-le si nécessaire en fonction de votre configuration.
        $this->addSql("INSERT INTO produit (titre, description, prix, categorie_id) VALUES ('titre 1', 'description 1', 11, 1)");
        $this->addSql("INSERT INTO produit (titre, description, prix, categorie_id) VALUES ('titre 2', 'description 2', 12, 1)");
        $this->addSql("INSERT INTO produit (titre, description, prix, categorie_id) VALUES ('titre 3', 'description 3', 13, 1)");
       
        $this->addSql("INSERT INTO produit (titre, description, prix, categorie_id) VALUES ('titre 4', 'description 4', 14, 2)");
        $this->addSql("INSERT INTO produit (titre, description, prix, categorie_id) VALUES ('titre 5', 'description 5', 15, 2)");
        $this->addSql("INSERT INTO produit (titre, description, prix, categorie_id) VALUES ('titre 6', 'description 6', 16, 2)");
    }

Pour effectuer cette tâche, il vous faudra taper la commande suivante dans le bash :
symfony console doctrine:migrations:execute 'DoctrineMigrations\Version20220112114803'
Remplacez le numéro de version avec celui qui correspond à votre fichier de migration. Attention, si vous vous trompez, vous devrez refaire un nouveau fichier de migration avec la commande :
symfony console doctrine:migrations:generate

Vous venez de remplir votre base de données avec deux catégories comprenant chacune trois produits. Nous allons voir en cette fin de chapitre comment afficher tout ceci dans une page Html.

Lister des produits en provenance de la base de données MySQL

Etant donné que nous allons manipulé notre table (Entity), nous allons devoir effectuer une requête. Celle-ci va nous permettre de faire une liste de tous les produits qui sont présents dans la table.

Cette requête va directement être exécutée dans le contrôleur de la page d'accueil. Il s'agit d'une simple ligne qui utilise le composant Doctrine.
Faites un "copier-coller" de tout le fichier /src/Controller/HomeController.php comme dans l'exemple suivant.

<?php

namespace App\Controller;

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

use App\Repository\ProduitRepository;

class HomeController extends AbstractController
{
    #[Route('/home', name: 'home')]
    public function index(ProduitRepository $repo): Response
    {
       
        $liste = $repo->findAll();

        return $this->render('home/index.html.twig', [
            'liste_twig' => $liste,// 'Passage de la variable Php ($liste) à la variable Twig ({{ liste_twig }} utilisée dans le fichier index.html.twig)
        ]);
    }
}

Nous utilisons dans cet exemple la variable $liste. Nous allons maintenant récupérer cette variable dans notre fichier Twig.
Modifiez le fichier /templates/home/index.html.twig comme dans le modèle ci-dessous.

{% extends 'base.html.twig' %}

{% block body %}

    {% for produit in liste_twig %}

        Produit = {{ produit.titre }} <br>

    {% endfor %}

{% endblock %}

Vous pouvez ouvrir votre navigateur internet favori et vous rendre à cette adresse :
127.0.0.1:8000/home
Vous devriez voir s'afficher la liste des produits grâce à la boucle for.

Dernière étape

Vous allez pouvoir afficher le détail d'un produit lors de la dernière session de cette formation express.

Menu