Modifier une donnée existante : la méthode classique vs la méthode automatique
Modification d'une donnée
Dans Symfony, il est très simple de mettre à jour une donnée déjà enregistrée dans notre base de données.
Pour atteindre cet objectif, il est possible d'utiliser plusieurs chemins. Je vous propose deux manière de faire.
- Méthode classique : récupérer la ligne grâce à l'id et modifier la donnée
- Méthode automatique 😊
Créer une nouvelle méthode dans mon contrôleur Symfony
Je vais commencer par ajouter une nouvelle méthode pour relier une URL dans la classe ManipulerBddController de mon contrôleur.
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
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',
]);
}
#[Route('/modifier', name: 'app_modifier')]
public function modifier(): Response
{
}
}
Je vais ensuite insérer une réponse sans passer par un template.
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
final class ManipulerBddController extends AbstractController
{
// …
#[Route('/modifier', name: 'app_modifier')]
public function modifier(): Response
{
return new Response('Je modifie !');
}
}
Ce bout de code permet d’afficher du texte en tapant localhost:8000/modifier.
Pour l’instant, nous n’avons affiché qu’un message, sans aucune modification réelle dans notre base de données. Cela nous permet de nous assurer que tout fonctionne correctement. 👍
Récupérer la ligne dans la base de données
Avant de pouvoir modifier quoi que ce soit, nous allons récupérer la ligne que l'on doit modifier grâce à une méthode PHP.
Je vérifie l'id de la ligne dans phpMyAdmin.
Nous allons récupérer l'id n°5 de notre table (ou entité 😁) Article.
Veuillez vérifier et adapter les id de votre propre table car il y aura très certainement des différences.
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use App\Repository\ArticleRepository;
final class ManipulerBddController extends AbstractController
{
// ...
#[Route('/modifier', name: 'app_modifier')]
public function modifier(ArticleRepository $articleRepository): Response
{
$article = $articleRepository->find(5);
dd($article);
return new Response('Je modifie !');
}
}
Nous avons injecté le repository d'Article qui a été automatiquement crée lorsque nous avons créer l'entité Article. C'est grâce au repository que nous pouvons récupérer des données de notre BDD.
Si je tape localhost:8000/modifier, je vais voir le contenu de la ligne sélectionner grâce à la fonction dd() !
C'est super tout fonctionne bien ! 🤩
On va maintenant modifier cette ligne.
Méthode 1 : la méthode classique avec find()
Code de la méthode 1
C'est la méthode la plus explicite. On utilise le Repository pour aller chercher manuellement l'article grâce à son identifiant unique (id) (c'est ce que nous avons fait précédemment).
Voici le code complet.
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use App\Repository\ArticleRepository;
final class ManipulerBddController extends AbstractController
{
// ...
#[Route('/modifier', name: 'app_modifier')]
public function modifier(ArticleRepository $articleRepository, EntityManagerInterface $em): Response
{
$article = $articleRepository->find(5);
$article->setTitle('Titre modifié avec la méthode classique !');
$article->setContent('Le contenu a été mis à jour avec succès.');
$em->flush();
return new Response('Je modifie !');
}
}
Explication de la méthode 1
Tout comme dans la leçon Insérer des données dans une base de données, il nous faut utiliser l'Entity Manager. [ligne 19]
Ensuite, on va utiliser des setters pour modifier chaque colonne (le titre et le contenu). [ligne 24 et 25]
Enfin, pour que la modification soit bien prise en compte dans notre base de données, on va envoyer les requêtes SQL grâce à la méthode flush().[ligne 27]
1
Exécuter le code de la méthode 1
Nous allons réactualiser la page et vérifier que la modification a bien été prise en compte.
Ça marche. 👌
Méthode 2 : méthode automatique
Une autre méthode, plus rapide mais moins intuitive et donc plus difficile à appréhender pour un débutant, existe également.
Rappel du fonctionnement des paramètres dynamiques !
Avant de commencer, je vous recommande de revoir le fonctionnement des paramètres dynamiques.
Maintenant que vous maîtrisez leur utilisation, nous allons les intégrer au contrôleur. Pour ce faire, nous allons supprimer ce que nous avons fait précédemment.
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use App\Repository\ArticleRepository;
final class ManipulerBddController extends AbstractController
{
// ...
#[Route('/modifier/{id}', name: 'app_modifier')]
public function modifier(int $id): Response
{
dd($id);
return new Response('Je modifie !');
}
}
Dans le code ci-dessus, je récupère un paramètre dynamique dans un paramètre de méthode, puis je l’affiche en utilisant dd().
En accédant à localhost:8000/modifier/15 dans un navigateur, le nombre 15 est affiché.
Code méthode 2 (méthode automatique)
Avec cette méthode, beaucoup de choses se sont automatiquement prises en charge par Symfony. Le code parle de lui-même.
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use App\Repository\ArticleRepository;
final class ManipulerBddController extends AbstractController
{
// ...
#[Route('/modifier/{id}', name: 'app_modifier')]
public function modifier(Article $article, EntityManagerInterface $em): Response
{
// Symfony a vu le {id} dans l'URL et a fait le "find()" en arrière-plan pour nous.
$article->setTitle('Coucou !');
$em->flush();
return new Response('J\'ai modifié avec la méthode automatique !');
}
}
En accédant à localhost:8000/modifier/6, le titre de la ligne correspondant à l’id 6 de ma table est modifié.
Pourquoi ça fonctionne ?
Symfony est intelligent : il remarque que votre route contient une variable appelée {id} et que votre fonction attend un objet Article. Il fait automatiquement le lien, exécute le $articleRepository->find($id) à votre place en coulisses.
Dans la prochaine leçon, nous allons apprendre à supprimer des données.
