Les fixtures Doctrine dans Symfony2

Les fixtures Doctrine dans Symfony2
par Rémi Leclerc, le 17/01/2015

Les fixtures Doctrine ont pour rôle de remplir la base de données avec un jeu de données. Cela permet de pouvoir tester une application avec de vraies données, sans devoir les resaisir à chaque fois : on crée un script de génération et elles sont ensuite insérées en base de données en exécutant une seule commande.

Dans Symfony2, par convention, les fixtures sont placées dans le dossier DataFixtures/ORM à la racine d'un bundle.

Installer DoctrineFixturesBundle

Installer le bundle DoctrineFixturesBundle :

composer require doctrine/doctrine-fixtures-bundle

Ajoutez DoctrineFixturesBundle dans la méthode registerBundles de app/AppKernel.php :

public function registerBundles()
{
  $bundles = array(
    // ...
    new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(),
  );
  // ...
}

Exemple de fixture

namespace Acme\MonBundle\DataFixtures\ORM;
 
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Acme\MonBundle\Entity\Article;
 
class MaFixture implements FixtureInterface
{
  /**
   * (non-PHPdoc)
   * @see \Doctrine\Common\DataFixtures\FixtureInterface::load()
   */
  public function load(ObjectManager $manager)
  {
    $this->enregistreArticlesTests();
  }
 
  /**
   * Enregistre mes articles de test.
   *
   * @param \Doctrine\Common\Persistence\ObjectManager $manager EntityManager
   * @return void
   */
  public function enregistreArticlesTests(ObjectManager $manager)
  {
    for ($i = 1; $i < 10; $i++)
    {
      $article = new Article();
      $article->setTexte('Test '.$i);
      $manager->persist($article);
    }
 
    $manager->flush();
  }
}

Utiliser le conteneur de services

Pour utiliser le conteneur de services, votre fixture doit simplement implémenter ContainerAwareInterface.

namespace Acme\MonBundle\DataFixtures\ORM;
 
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
 
class MaFixture implements FixtureInterface, ContainerAwareInterface
{
  /**
   * @var \Symfony\Component\DependencyInjection\ContainerInterface Conteneur de services
   */
  private $container;
 
  /**
   * (non-PHPdoc)
   * @see \Symfony\Component\DependencyInjection\ContainerAwareInterface::setContainer()
   */
  public function setContainer(ContainerInterface $container = null)
  {
    $this->container = $container;
  }
 
  /**
   * (non-PHPdoc)
   * @see \Doctrine\Common\DataFixtures\FixtureInterface::load()
   */
  public function load(ObjectManager $manager)
  {
    // ...
  }
}

Exécuter les fixtures

Exécuter les fixtures avec ré-initialisation de la base

php app/console doctrine:fixtures:load

Attention, cette commande videra votre base de données.

Exécuter les fixtures avec mise à jour de la base

php app/console doctrine:fixtures:load --append

Documentation officielle de DoctrineFixturesBundle