Aller au contenu principal

Utilisation des Fixtures

Schéma

Comment utiliser les fixtures pour peupler votre base de données dans Symfony

Petite vérification​

Avant de commencer, vérifiez si vous savez...

  1. expliquer la différence entre authentification et autorisation, avec un exemple tiré du jeu (joueurs et personnages)
  2. citer les deux méthodes qu'une classe qui étend Voter doit implémenter, et préciser laquelle contient la véritable logique de décision
  3. pour le CharacterVoter de la séance précédente (voteOnAttribute() qui retourne $character->getPlayer() === $user), prédire le résultat de $this->denyAccessUnlessGranted('EDIT', $character); si le joueur connecté n'est pas le propriétaire du personnage
📌 Réponse attendue

Notions théoriques​

Les fixtures sont un moyen de charger un ensemble de données fixes dans votre base de données. C'est particulièrement utile lorsque vous voulez peupler votre base de données avec des données pour tester votre application pendant le développement.

Symfony ne fournit pas de fonctionnalité de fixtures par défaut, mais il existe une bibliothèque appelée DoctrineFixturesBundle que vous pouvez utiliser. Cette bibliothèque vous permet de créer des classes de fixtures qui définissent quelles données charger dans la base de données.

Exemple de mise en application​

Pour utiliser DoctrineFixturesBundle, vous devez d'abord l'installer en exécutant la commande suivante :

composer require --dev orm-fixtures

Ensuite, vous pouvez créer une classe de fixtures dans le répertoire src/DataFixtures de votre projet. Par exemple, pour créer des données de test (5 personnages) pour votre entité Character, vous pourriez créer une classe CharacterFixtures :

namespace App\DataFixtures;

use App\Entity\Character;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;

class CharacterFixtures extends Fixture
{
public function load(ObjectManager $manager)
{
for ($i = 0; $i < 5; $i++) {
$character = new Character();
$character->setName('Personnage n°' . $i);
$character->setExperience($i * 10);

$manager->persist($character);
}

$manager->flush();
}
}

Pour charger les fixtures dans la base de données, vous pouvez exécuter la commande suivante :

php bin/console doctrine:fixtures:load
astuce

Pour créer facilement un fichier de fixtures, vous pouvez exécuter la commande suivante :

php bin/console make:fixture

Test de mémorisation/compréhension​


Qu'est-ce qu'une fixture dans Symfony ?


Comment installe-t-on DoctrineFixturesBundle dans Symfony ?


Comment crée-t-on une classe de fixtures dans Symfony ?


Comment charge-t-on les fixtures dans la base de données dans Symfony ?



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

Votre défi pour aujourd'hui consiste à créer des fixtures pour votre application

Vous devrez créer une classe de fixtures pour votre entité Character qui crée 10 personnages avec différents niveaux d'expérience.


Bonne pratique - Fixtures pour la reproductibilité des environnements de test

Les fixtures servent à créer un jeu de données cohérent et reproductible pour le développement et les tests. Par convention, elles ne doivent exister que dans l'environnement dev. La commande doctrine:fixtures:load vide la base avant de charger les données : c'est voulu pour garantir un état propre. Pour ajouter sans effacer, utiliser l'option --append.

📌 Une solution