2012-08-05 17 views
19

Con Smyfony2 y Doctrin2, accesorios de datos se pueden crear mediante el siguiente ejemplo: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.htmlaccesorios de datos específicos de entorno con Symfony + Doctrina

Lo que me gustaría es ser capaz de utilizar este concepto para las pruebas de modo que la instalación/desmontaje puede crear un entorno de datos de prueba puro para pruebas funcionales. ¿Cómo puedo hacer que se ejecute un conjunto específico de dispositivos de solo prueba durante las pruebas funcionales y cómo separe estos dispositivos de mis dispositivos estándar para que el comando de la consola los ignore?

Parece que la forma de hacerlo sería replicar la funcionalidad de la doctrina: el comando de la consola de dispositivos y almacenar los accesorios de prueba en otro lugar. ¿Alguien tiene una solución mejor?

Respuesta

35

Una alternativa para dividir dispositivos por directorio es utilizar una clase de dispositivo personalizada. Sus clases de aparatos serían luego extender esta clase y especificar los entornos en realidad va a ser cargado en

<?php 

use Doctrine\Common\DataFixtures\FixtureInterface; 
use Doctrine\Common\Persistence\ObjectManager; 
use Symfony\Component\DependencyInjection\ContainerAwareInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\HttpKernel\KernelInterface; 

/** 
* Provides support for environment specific fixtures. 
* 
* This container aware, abstract data fixture is used to only allow loading in 
* specific environments. The environments the data fixture will be loaded in is 
* determined by the list of environment names returned by `getEnvironments()`. 
* 
* > The fixture will still be shown as having been loaded by the Doctrine 
* > command, `doctrine:fixtures:load`, despite not having been actually 
* > loaded. 
* 
* @author Kevin Herrera <[email protected]> 
*/ 
abstract class AbstractDataFixture implements ContainerAwareInterface, FixtureInterface 
{ 
    /** 
    * The dependency injection container. 
    * 
    * @var ContainerInterface 
    */ 
    protected $container; 

    /** 
    * {@inheritDoc} 
    */ 
    public function load(ObjectManager $manager) 
    { 
     /** @var KernelInterface $kernel */ 
     $kernel = $this->container->get('kernel'); 

     if (in_array($kernel->getEnvironment(), $this->getEnvironments())) { 
      $this->doLoad($manager); 
     } 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    public function setContainer(ContainerInterface $container = null) 
    { 
     $this->container = $container; 
    } 

    /** 
    * Performs the actual fixtures loading. 
    * 
    * @see \Doctrine\Common\DataFixtures\FixtureInterface::load() 
    * 
    * @param ObjectManager $manager The object manager. 
    */ 
    abstract protected function doLoad(ObjectManager $manager); 

    /** 
    * Returns the environments the fixtures may be loaded in. 
    * 
    * @return array The name of the environments. 
    */ 
    abstract protected function getEnvironments(); 
} 

sus accesorios podrían terminar pareciéndose a esto:.

<?php 

namespace Vendor\Bundle\ExampleBundle\DataFixtures\ORM; 

use AbstractDataFixture; 
use Doctrine\Common\Persistence\ObjectManager; 

/** 
* Loads data only on "prod". 
*/ 
class ExampleData extends AbstractDataFixture 
{ 
    /** 
    * @override 
    */ 
    protected function doLoad(ObjectManager $manager) 
    { 
     // ... snip ... 
    } 

    /** 
    * @override 
    */ 
    protected function getEnvironments() 
    { 
     return array('prod'); 
    } 
} 

creo que esto debería funcionar tanto con ORM un accesorio de datos ODM.

+5

¡esto es genio! – ferdynator

+2

¿Cómo se define el entorno desde la consola? Usando 'php app/console fixture: load --env = prod'? – xDaizu

+0

Respondiendo a mí mismo: Yesh, 'aplicación php/accesorio de consola: carga --env = prod' que funciona con la solución proporcionada :) – xDaizu

17

La manera más fácil es colocar los dispositivos en carpetas diferentes y luego cargarlos con el comando php app/console doctrine:fixtures:load --fixtures=../src/Acme/TestBundle/DataFixtures/ORM/test. La opción de accesorios debe apuntar a la ruta relativa desde donde se encuentra la carpeta de aplicaciones.

A continuación, puede dividir sus datos en inicial, prueba y así sucesivamente o crear desarrollo, prueba, puesta en escena, accesorios, como quiera.

Si quieres mezclarlos, no conozco ninguna solución mejor que la que hice: creo una carpeta de "plantillas" donde residen todos los dispositivos. En mi carpeta de desarrollo, creo una clase que amplía el la clase de dispositivo adecuada de la plantilla y ajusta lo que se necesita para ajustar (como anular el método getOrder). No es perfecto y creo que uno podría pensar en extender los dispositivos: comando de carga para tomar múltiples rutas, pero funciona para mí.

+0

Eso suena como un buen comienzo. ¡Gracias! –

Cuestiones relacionadas