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.
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.
Ça fonctionne ! 😁
On peut d'ailleurs compléter notre schéma.
Dans la leçon suivante, nous allons modifier une données.
