Hostinger

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 😊
Deux méthodes pour enregistrer des données

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.

Je modifie symfony

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.

Récupérer l'id 5 de notre table Article

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() !

Afficher le contenu d'une ligne grâce à la fonction dd() de Symfony

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.

La ligne de la bdd a été modifiée

Ç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é.

Afficher nombre 15 dans le navigateur grâce à la fonction dd()

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é.

Utilisation d'un paramètre dynamique dans un navigateur
Deuxième de la table de la bdd modifiée

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.