Cargar datos (fixtures) por defecto en Symfony

symfony.jpg
Solucionex
07
Dic 17

Las fixtures se pueden utilizar dentro del desarrollo de aplicaciones Symfony para cargar una serie de datos fake en nuestra aplicación web y cuando generemos un nuevo entorno, en una máquina vagrant por ejemplo. O si compartimos nuestro proyecto con otros usuarios o compañeros, estos puedan empezar ya a trabajar con una serie de datos por defecto con los que probar las operaciones o la maquetación del sitio.

Una solución rápida para tener datos por defecto en la aplicación puede ser versionar la base de datos, o en el repositorio tener un fichero con una copia de la base de datos. Aunque esto no es especialmente cómodo, ni encuadra dentro del framework Symfony, ya que tenemos toda la base de datos sincronizada en código y la podemos crear y mantener mediante comandos. Con lo que hacer una importación para tener unos datos precargados es un error, ya que se nos puede desincronizar.

La solución que te proponemos para usar fixtures en Symfony es además, más sencilla y cómoda que tener que tocar la base de datos, y es que el DoctrineFixturesBundle es muy sencillo de usar:

Primero lo instalamos vía composer, con la opción --dev le indicamos que solo lo queremos para entornos de desarrollo.

$ composer require --dev doctrine/doctrine-fixtures-bundle

Registramos el bundle en el AppKernel, en el apartado desarrollo y test.

//app/AppKernel.php //... // registerBundles() if (in_array($this->getEnvironment(), array('dev', 'test'), true)) { // ... $bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(); }

Hasta aquí no ha habido ninguna dificultad. La parte más delicada de la operación es crear los datos fake. Crearemos las carpetas DataFixtures/ORM dentro del Bundle, y dentro de la última el fichero LoadPostData.php, el nombre tiene que ser descriptivo, en este caso vamos a cargar una serie de posts.

namespace AppBundle\DataFixtures\ORM; use Doctrine\Common\DataFixtures\FixtureInterface; use Doctrine\Common\Persistence\ObjectManager; use AppBundle\Entity\Post; class LoadPostData implements FixtureInterface { /** * * @param ObjectManager $manager */ public function load(ObjectManager $manager) { for ($i = 1; $i < 100; $i++) { $this->createPost($manager, $i); } } /** * * @param ObjectManager $manager * @param type $n */ private function createPost(ObjectManager $manager, $n) { $post = new Post(); $post->setTitle('Post ' . $n); $post->setBody('Lorem ipsum dolor sit amet, consectetur adipiscing elit...'); $post->setCreatedAt(new \DateTime(date("Y-m-d H:i:s", mt_rand(1262055681, 1562055681)))); $manager->persist($post); $manager->flush(); } }

¿Te ha resultado difícil? No lo creo. Ahora cuando queramos montar un nuevo entorno con nuestra aplicación Symfony será tan sencillo como ejecutar los comandos para la creación de la base de datos y después cargaremos los fixtures también vía consola de comandos:

$ php bin/console doctrine:fixtures:load