Fixtures SonataUserBundle en Symfony2

En ocasiones, necesitamos dotar de contenidos a nuestra base de datos, ya sean datos reales o de prueba.

Symfony por si mismo, no ofrece ningún sistema para gestionar fixtures, pero estamos de suerte, Doctrine2 tiene una librería que nos permite escribirlos, DoctrineFixturesBundle.

El código de este post, es para tus DataFixtures sobre Doctrine ORM, y crean 2 grupos de usuarios y un usuario super-admin, para SonataUserbundle.

Instalar DoctrineFixturesBundle

Lo primero es instalar DoctrineFixturesBundle:

php composer.phar require doctrine/doctrine-fixtures-bundle

Ahora lo añadimos a nuestro app/AppKernel.php, es importante que te fijes en donde se añade, en nuestros entornos ‘dev’ y ‘test’:

// app/AppKernel.php
// ...

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        // ...
        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle();
        }

        return $bundles
    }

    // ...
}

Con estos 2 pasos, ya tenemos instalado

Escribimos nuestros Fixtures en Symfony2

Vamos a utilizar la funcionalidad que nos ofrece este bundle, de indicar el orden de ejecución de cada uno de nuestros fixtures, y de referenciar los objetos entre ellos.

Creamos fixtures para los grupos:

namespace Application\Sonata\UserBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Application\Sonata\UserBundle\Entity\Group;

/**
 * Creación inicial grupos Super-administrador y Administrador
 *
 * @author Juanjo García
 */
class LoadGroupData extends AbstractFixture implements OrderedFixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $groupSuperAdmin = new Group('Super-administrador', array("ROLE_SUPER_ADMIN"));  

        $manager->persist($groupSuperAdmin);
        $manager->flush();

        $this->addReference('super-admin-group', $groupSuperAdmin);
        
        $groupAdmin = new Group('Administrador', array("ROLE_ADMIN"));  

        $manager->persist($groupAdmin);
        $manager->flush();
    }

    public function getOrder()
    {
        // the order in which fixtures will be loaded
        // the lower the number, the sooner that this fixture is loaded
        return 1;
    }
}

En la línea 10, referenciamos el grupo ‘Super-administrador’ que utilizaremos para asignárselo al usuario.

Creamos fixtures para el usuario:

<?php

namespace Application\Sonata\UserBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Application\Sonata\UserBundle\Entity\User;

/**
 * Creación inicial de usuario Super-administrador
 *
 * @author Juanjo García
 */
class LoadUserData extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }    
    
    public function load(ObjectManager $manager)
    {        
        
        $userAdmin = new User();
        $userAdmin->setUsername('super-admin');
        $userAdmin->setUsernameCanonical('super-admin');
        $userAdmin->setEmail('your@email.com');
        $userAdmin->setEmailCanonical('your@email.com');   
        $userAdmin->setFirstname('Juanjo');
        $userAdmin->setLastname('García');   
        $userAdmin->setWebsite('http://www.editartgroup.com');
        $userAdmin->setGender('m');   
        $userAdmin->setLocale('es_ES');  
        $userAdmin->setTimezone('Europe/Madrid');  
        $userAdmin->setRealRoles(array("ROLE_SUPER_ADMIN"));  
        $userAdmin->setEnabled(1);
        $userAdmin->setGroups(array($this->getReference('super-admin-group')));
        $encoder = $this->container->get('security.password_encoder');
        $password = $encoder->encodePassword($userAdmin, 'your_password');
        $userAdmin->setPassword($password);

        $manager->persist($userAdmin);
        $manager->flush();

        $this->addReference('super-admin-user', $userAdmin);
    }

    public function getOrder()
    {
        // the order in which fixtures will be loaded
        // the lower the number, the sooner that this fixture is loaded
        return 2;
    }
}

Cargamos fixtures

Lanzamos el comando de consola:

php app/console doctrine:fixtures:load

Hay que tener mucho cuidado, ya que este comando, limpiará nuestra base de datos para incluir los que están definidos en nuestros fixtures.

Si lo que queremos es añadirlos, manteniendo todos los contenidos existentes en la base de datos, debemos incluir la opción append:

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

En este momento, ya tenemos volcados nuestros contenidos en la base de datos. ¡A disfrutar!

Referencias