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 :
-
Au lieu d'utiliser des commentaires, on utilise l'attribut
#[Route]
directement au-dessus des méthodes du contrôleur. -
L'import se fait ainsi :
use Symfony\Component\Routing\Annotation\Route;
-
La syntaxe est plus claire et offre une meilleure intégration avec l'IDE :
#[Route('/player/create', name: 'create_player')]
public function create(): Response
{
// ...
}
- On peut facilement ajouter des options supplémentaires comme les méthodes HTTP autorisées :
#[Route('/player/{id}', name: 'show_player', methods: ['GET'])]
- 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 :
-
Au lieu d'utiliser
$this->getDoctrine()->getManager()
, on injecte directement l'EntityManager dans le constructeur ou la méthode du contrôleur. -
On utilise l'interface
EntityManagerInterface
pour une meilleure abstraction :
use Doctrine\ORM\EntityManagerInterface;
public function create(EntityManagerInterface $entityManager): Response
{
// Utilisation de $entityManager ici
}
-
Symfony s'occupe automatiquement d'injecter la bonne instance de l'EntityManager grâce à l'autowiring.
-
Cette approche rend le code plus testable, car on peut facilement mocker l'EntityManager dans les tests unitaires.
-
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.
-
On peut utiliser cette même technique pour injecter d'autres services, rendant le code plus modulaire et facile à maintenir.
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
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
Vous devez être connecté pour voir le contenu.