Aller au contenu principal

Ecrire des données dans la BD

Comment enregistrer des données avec l'EntityManager

Notions théoriques

Dans Symfony 7, l'interaction avec la base de données se fait principalement via Doctrine ORM.

Après avoir défini vos entités, vous pouvez effectuer des opérations CRUD (Create, Read, Update, Delete) sur vos données.

Le composant central pour ces opérations est l'EntityManager, qui gère la persistance des objets dans la base de données.

Exemple de mise en application

Voici un exemple de création d'un nouvel objet Player et sa sauvegarde dans la base de données avec Symfony 7 :

use App\Entity\Player;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class PlayerController extends AbstractController
{
#[Route('/player/create', name: 'create_player')]
public function create(EntityManagerInterface $entityManager): Response
{
$player = new Player();
$player->setName('Miss Fortune');

$entityManager->persist($player);
$entityManager->flush();

return new Response('Player created with id '.$player->getId());
}
}

Etudions ce code

$player = new Player();

Crée une nouvelle instance de l'entité Player.

$player->setName('Miss Fortune');

Définit le nom du joueur en utilisant le setter généré par Doctrine.

$entityManager->persist($player);

Indique à Doctrine que nous voulons enregistrer l'objet $player.

$entityManager->flush();

Exécute la requête SQL pour enregistrer les changements dans la base de données.

Utilisation des attributs pour le routage

Dans Symfony 7, les attributs PHP sont largement utilisés pour configurer le routage, remplaçant les anciennes annotations. Voici comment cela fonctionne :

  1. Au lieu d'utiliser des commentaires, on utilise l'attribut #[Route] directement au-dessus des méthodes du contrôleur.

  2. L'import se fait ainsi : use Symfony\Component\Routing\Annotation\Route;

  3. La syntaxe est plus claire et offre une meilleure intégration avec l'IDE :

#[Route('/player/create', name: 'create_player')]
public function create(): Response
{
// ...
}
  1. On peut facilement ajouter des options supplémentaires comme les méthodes HTTP autorisées :
#[Route('/player/{id}', name: 'show_player', methods: ['GET'])]
  1. Cette approche permet une meilleure validation au moment de la compilation et une meilleure performance, car les attributs sont traités nativement par PHP.

Injection de dépendances pour l'EntityManager

L'injection de dépendances pour l'EntityManager dans Symfony 7 simplifie grandement l'accès aux fonctionnalités de Doctrine :

  1. Au lieu d'utiliser $this->getDoctrine()->getManager(), on injecte directement l'EntityManager dans le constructeur ou la méthode du contrôleur.

  2. On utilise l'interface EntityManagerInterface pour une meilleure abstraction :

use Doctrine\ORM\EntityManagerInterface;

public function create(EntityManagerInterface $entityManager): Response
{
// Utilisation de $entityManager ici
}
  1. Symfony s'occupe automatiquement d'injecter la bonne instance de l'EntityManager grâce à l'autowiring.

  2. Cette approche rend le code plus testable, car on peut facilement mocker l'EntityManager dans les tests unitaires.

  3. Elle permet également une meilleure séparation des préoccupations, car le contrôleur n'a pas besoin de connaître les détails de l'implémentation de Doctrine.

  4. On peut utiliser cette même technique pour injecter d'autres services, rendant le code plus modulaire et facile à maintenir.

astuce

Ces 2 techniques :

  • l'utilisation des attributs pour le routage
  • et l'injection de dépendances pour l'EntityManager

sont des pratiques modernes qui rendent le code Symfony plus propre, plus lisible et plus facile à maintenir.

Test de mémorisation/compréhension


Dans Symfony 7, comment injecte-t-on l'EntityManager dans un contrôleur ?


Quelle méthode de l'EntityManager est utilisée pour préparer un objet à être sauvegardé ?


Quelle méthode de l'EntityManager exécute réellement les requêtes SQL ?


Comment définit-on une route dans Symfony 7 ?


Quel est l'avantage d'utiliser l'injection de dépendances pour l'EntityManager dans Symfony 7 ?


TP pour réfléchir et résoudre des problèmes

Votre défi pour aujourd'hui consiste à coder une méthode qui crée un nouveau joueur dans Symfony 7.

Ajoutez une nouvelle méthode create() à votre PlayerController qui crée un joueur avec le nom 'Toto' lors de l'accès à la route /player/create.

Vérifiez ensuite si le joueur 'Toto' a bien été enregistré dans la table correspondante de votre base de données.

Une solution