Hostinger

L'EntityManager : Enregistrer des données

Le rôle de l'Entity Manager

Dans la leçon sur l'ORM, nous avons décrit l'Entity Manager comme un assistant qui s'occupe de l'action. Cet assistant, permet d'enregistrer, de modifier et de supprimer une données dans notre base de données grâce à du PHP.

Pour travail avec lui, il suffit tout simplement d'utiliser l'injection de dépendances.

Avec l'injection de dépendance, il suffit de le passer en paramètre de votre méthode !

Étapes d'enregistrement d'une donnée dans notre base de données

Pour commencer, nous allons illustrer les étapes de la création de nouvelles données à l’aide d’un schéma.

Étapes pour l'enregistrement de données dans une BDD dans Symfony

Passons à la pratique ! 😬

Créer et enregistrer une donnée dans la BDD grâce à Symfony

Nous allons créer un nouveau contrôleur, car aucun n’a encore été créé dans ce projet.

php bin/console make:controller ManipulerBddController

Comme vous le savez probablement, cette commande a créé deux fichiers. Concentrons-nous sur le contrôleur :

projet_avec_bdd
|-- src/
 |-- Controller/
  |-- ManipulerBddController.php

Comme indiqué, nous allons utiliser l'Entity Manager de Symfony.

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Doctrine\ORM\EntityManagerInterface;

final class ManipulerBddController extends AbstractController
{
    #[Route('/manipuler/bdd', name: 'app_manipuler_bdd')]
    public function index(EntityManagerInterface $em): Response
    {
        return $this->render('manipuler_bdd/index.html.twig', [
            'controller_name' => 'ManipulerBddController',
        ]);
    }
}

On utilise le système de namespace pour indiquer à Symfony que nous allons utiliser une classe spécifique [ligne 6] que nous injectons directement dans la méthode [ligne 11]. On pourra utiliser cet outil grâce $em.

Maintenant, nous allons écrire du code pour créer une nouvelle ligne dans notre base de données. Vous allez voir avec Symfony et l'Entity Manager, les choses sont très simple. 😊

Nous allons aborder ce sujet étape par étape afin de bien comprendre.

1 - Créer l'objet PHP

Nous allons commencer par préparer le terrain.

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Article;

final class ManipulerBddController extends AbstractController
{
    #[Route('/manipuler/bdd', name: 'app_manipuler_bdd')]
    public function index(EntityManagerInterface $em): Response
    {

        $article = new Article();
        $article->setTitle('Mon premier article !');
        $article->setContent('Le contenu de mon superbe article de blog.');

        return $this->render('manipuler_bdd/index.html.twig', [
            'controller_name' => 'ManipulerBddController',
        ]);
    }
}

J'ai mis en évidence, le code que nous avons ajouté et nous allons décrypter ligne par ligne.

$article = new Article();

On crée une instance de la classe Article [ligne 17] en spécifiant la classe via le namespace [ligne 9]. Ce namespace correspond à l’Entity Article que nous avons créée précédemment.

PHP crée alors un objet vide, représentant une future ligne dans la table article.

$article->setTitle('Mon premier article !');

Nous utilisons désormais un Setter (une méthode permettant de modifier une propriété) pour attribuer un titre à notre objet PHP. Cette méthode (->setTitle) est correctement implémentée dans notre fichier src/Entity/Article.php, assurant ainsi la cohérence de notre code.

Le titre attribué à notre objet est « Mon premier article ! ».

On viens de de définir le contenu de la future colonne title pour cette ligne. 👍

$article->setContent'Le contenu de mon superbe article de blog.');

On applique la même chose à la colonne content ! Pour l’instant, rien ne se passe dans la base de données car on prépare le terrain. On a actuellement un objet contenant le contenu de notre future ligne.

2 - Préparation

Nous allons maintenant utiliser l’Entity Manager pour préparer l’enregistrement.

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Article;

final class ManipulerBddController extends AbstractController
{
    #[Route('/manipuler/bdd', name: 'app_manipuler_bdd')]
    public function index(EntityManagerInterface $em): Response
    {

        $article = new Article();
        $article->setTitle('Mon premier article !');
        $article->setContent('Le contenu de mon superbe article de blog.');

        $em->persist($article);

        return $this->render('manipuler_bdd/index.html.twig', [
            'controller_name' => 'ManipulerBddController',
        ]);
    }
}

À ce stade, aucune requête SQL n'est envoyée !

3 - Requêtes SQL envoyées à la base de données

Nous arrivons à la dernière étape, qui consiste à envoyer les requêtes SQL à la base de données.

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Article;

final class ManipulerBddController extends AbstractController
{
    #[Route('/manipuler/bdd', name: 'app_manipuler_bdd')]
    public function index(EntityManagerInterface $em): Response
    {

        $article = new Article();
        $article->setTitle('Mon premier article !');
        $article->setContent('Le contenu de mon superbe article de blog.');

        $em->persist($article);

        $em->flush();

        return $this->render('manipuler_bdd/index.html.twig', [
            'controller_name' => 'ManipulerBddController',
        ]);
    }
}

Maintenant, si nous allons dans la page /manipuler/bdd, une ligne sera crée dans notre base de données. Si je réactualise, une autre ligne sera crée dans notre base de données (avec le même contenu).

Nous pouvons vérifier grâce à phpMyAdmin.

Creation de deux lignes dans la base de données grâce à l'Entity Manager

Ça fonctionne ! 😁

On peut d'ailleurs compléter notre schéma.

Etapes d'enregistrement de données avec du codes

Dans la leçon suivante, nous allons modifier une données.