jueves, 10 de octubre de 2013

DoctrineFixturesBundle

En el archivo composer.json:

nano composer.json

agregar debajo de "require":

"doctrine/doctrine-fixtures-bundle": "dev-master"


actualizar las librerías:

php composer.phar update

registrar el bundle en AppKernel.php

nano nano app/AppKernel.php

agregando la línea

new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(),

debajo de $bundles = array(

Crear la clase abstracta que leerá y parseará los fixtures en formato YAML

namespace Petramas\MainBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Yaml\Yaml;

abstract class LoadPetramasData extends AbstractFixture implements ContainerAwareInterface
{
    /**
    * Return the file for the current model.
    */
    abstract function getModelFile();

    /**
    * @var Symfony\Component\DependencyInjection\ContainerInterface
    */
    private $container;

    /**
    * Make the sc available to our loader.
    *
    * @param ContainerInterface $container
    */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    /**
    * Return the fixtures for the current model.
    *
    * @return Array
    */
    public function getModelFixtures()
    {
        $fixturesPath = realpath(dirname(__FILE__). '/../fixtures');
        $fixtures = Yaml::parse(file_get_contents($fixturesPath . '/' . $this->getModelFile() . '.yml'));

        return $fixtures;
    }
}

Crear una clase que persista la data leída por la clase anterior, debe crearse una por cada entidad que va a conter datos de inicio o fixtures

namespace Petramas\MainBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;

use Petramas\MainBundle\DataFixtures\ORM\LoadPetramasData;
use Petramas\MainBundle\Entity\Cliente as Cliente;

class LoadClienteData extends LoadPetramasData implements OrderedFixtureInterface
{
    /**
     * Main load function.
     *
     * @param Doctrine\Common\Persistence\ObjectManager $manager
     */
    function load(ObjectManager $manager)
    {
        $clientes = $this->getModelFixtures();

        // Now iterate thought all fixtures
        foreach ($clientes['Cliente'] as $reference => $columns)
        {
            $cliente = new Cliente();
            $cliente->setEstado($manager->merge($this->getReference('Estado_' . $columns['estado'])));
            $cliente->setRazonSocial($columns['razon_social']);
            $cliente->setRuc($columns['ruc']);
            $cliente->setDireccion($columns['direccion']);
            $manager->persist($cliente);

            // Add a reference to be able to use this object in others entities loaders
            $this->addReference('Cliente_'. $reference, $cliente);
        }
        $manager->flush();
    }

    /**
     * The main fixtures file for this loader.
     */
    public function getModelFile()
    {
        return 'clientes';
    }

    /**
     * The order in which these fixtures will be loaded.
     */
    public function getOrder()
    {
        return 1;
    }
}

Crear los datos de inicio en formato YAML, nuevamente, un archivo YAML por entidad a alojar fixtures.

Cliente:
    valle:
        estado: activo
        razon_social: Valle Distribuciones S.A.C.
        ruc: 10123456789
        direccion: Av. Valle 124

    indurama:
        estado: activo
        razon_social: Indurama Seguros S.A.
        ruc: 451235052
        direccion: Calle. Los Nísperos 864

    famucha:
        estado: activo
        razon_social: La Real Famucha E.I.R.L.
        ruc: 407526379
        direccion: Jirón Noche Buena 2413 Interior 25 A

Ejecutar el comando para truncar todos los registros de las entidades a aplicar fixtures y leerlos de los archivos YAML.

php app/console doctrine:fixtures:load