generate - Dispositivos de datos específicos del entorno con Symfony+Doctrine
generate entity symfony (2)
La forma más sencilla es colocar los dispositivos en diferentes carpetas y luego cargarlos con la 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.
Luego, puede dividir sus datos en iniciales, pruebas, etc., o crear dispositivos de desarrollo, pruebas, escenarios, productos, como desee.
Si desea 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 extiende la clase de artefactos adecuada. plantilla y ajusta lo que se necesita para ajustar (como anular el método getOrder
). No es perfecto y supongo que se podría pensar en extender los dispositivos: cargar el comando para tomar varias rutas, pero a mí me funciona.
Con Smyfony2 y Doctrin2, los dispositivos de datos se pueden crear usando el siguiente ejemplo: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html
Lo que me gustaría es poder usar este concepto para las pruebas, de modo que la configuración / desmontaje pueda crear un entorno de datos de prueba puros para las pruebas funcionales. ¿Cómo puedo tener un conjunto específico de dispositivos de prueba solo durante las pruebas funcionales y cómo separar 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 los dispositivos y almacenar los dispositivos de prueba en otro lugar. ¿Alguien tiene una solución mejor?
Una alternativa a romper los aparatos por directorio es usar una clase de aparatos personalizada. Tus clases de aparatos extenderían esta clase y especificarían los entornos en los que se cargará.
<?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();
}
Tus accesorios acabarían 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 como con los accesorios de datos ODM.