Nous allons dans ce billet insérer des données de test dans notre application de façon à avoir un jeu d’essai fonctionnel. Ceci va nous permettre de développer certaines partie de l’application sans se soucier de la présence de données qui devrait être créées par des formulaires qui n’existent pas encore.
Pour cela, nous allons utiliser le bundle qui se nomme « Doctrine Data Fixtures ».
Vu que nous utilisons git, l’ajout d’un bundle se résume à la modification du fichier « deps » se trouvant à la racine de notre projet. Nous devons ajouter les lignes suivantes en fin de fichier:
[doctrine-fixtures] git=http://github.com/doctrine/data-fixtures.git [DoctrineFixturesBundle] git=http://github.com/symfony/DoctrineFixturesBundle.git target=/bundles/Symfony/Bundle/DoctrineFixturesBundle
Il faut ensuite procéder au téléchargement de ce bundle. Ceci va du même coup faire une mise à jour de tous les autres composant qui n’ont pas de version définit dans le deps.lock.
Nous allons encore une fois utiliser la console:
./bin/vendors install
Ensuite, nous devons déclarer ceci dans l’autoloader « autoload.php ».
$loader->registerNamespaces(array( ... 'Doctrine\\Common\\DataFixtures' => __DIR__.'/../vendor/doctrine-fixtures/lib', ... ));
ATTENTION:
Il faut déclarer le nouveau namespace avant « Doctrine\Common ».
Ensuite, enregistrer le bundle DoctrineFixturesBundle dans app/AppKernel.php.
// ... public function registerBundles() { $bundles = array( // ... new Symfony\Bundle\DoctrineFixturesBundle\DoctrineFixturesBundle(), // ... ); // ... }
Nous allons à présent créer un répertoire « DataFixtures » dans notre bundle, puis un sous répertoire « ORM ». A l’intérieur de ce dernier, nous allons créer notre fichier de fixtures: LoadRecetteData.php
<?php namespace Tuyau\RctBundle\DataFixtures\ORM; use Doctrine\Common\DataFixtures\FixtureInterface; use Tuyau\RctBundle\Entity\Ingredient; use Tuyau\RctBundle\Entity\Rct_ingr; use Tuyau\RctBundle\Entity\Recette; use Tuyau\RctBundle\Entity\Unite; class LoadRecetteData implements FixtureInterface { public function load($manager) { $farine = new Ingredient(); $farine->setNom('farine'); $manager->persist($farine); $sucre = new Ingredient(); $sucre->setNom('sucre'); $manager->persist($sucre); $oeuf = new Ingredient(); $oeuf->setNom('oeuf'); $manager->persist($oeuf); $sel = new Ingredient(); $sel->setNom('sel'); $manager->persist($sel); $beurre = new Ingredient(); $beurre->setNom('beurre'); $manager->persist($beurre); $unite1 = new Unite(); $unite1->setLibelle('g'); $manager->persist($unite1); $unite2 = new Unite(); $unite2->setLibelle('cl'); $manager->persist($unite2); $pizza = new Recette(); $pizza->setNom('pizza'); $pizza->setModeoperatoire('bien mélanger'); $manager->persist($pizza); $r1 = new Rct_ingr(); $r1->setIngredient($farine); $r1->setQte(100); $r1->setUnite($unite1); $r1->setRecette($pizza); $manager->persist($r1); $r2 = new Rct_ingr(); $r2->setIngredient($beurre); $r2->setQte(50); $r2->setUnite($unite1); $r2->setRecette($pizza); $manager->persist($r2); $r3 = new Rct_ingr(); $r3->setIngredient($oeuf); $r3->setQte(1); $r3->setUnite($unite2); $r3->setRecette($pizza); $manager->persist($r3); $manager->flush(); } }
Chargement des données: encore avec la console.
./app/console doctrine:fixtures:load > purging database > loading Tuyau\RctBundle\DataFixtures\ORM\LoadRecetteData
Une petite vérification dans phpmyadmin:
Et par exemple pour la table ingrédient:
Pas beaucoup de commentaires à faire car c’est assez explicite. Attention tout de même, les données existantes vont être supprimées lors du chargement des fixtures. Il est possible de rajouter le paramètre « –append » pour ajouter les données plutôt que de les remplacer.
Nous pouvons aussi consulter ces données dans notre application:
http://recette.local/app_dev.php/ingredient/
C’est tout pour aujourd’hui…