Skip to content

Commit

Permalink
Integrating new data fixtures code.
Browse files Browse the repository at this point in the history
  • Loading branch information
jwage authored and fabpot committed Oct 5, 2010
1 parent 2525998 commit ff683a6
Show file tree
Hide file tree
Showing 12 changed files with 257 additions and 156 deletions.
17 changes: 9 additions & 8 deletions autoload.php.dist
Expand Up @@ -6,13 +6,14 @@ use Symfony\Component\HttpFoundation\UniversalClassLoader;

$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
'Symfony' => __DIR__.'/src',
'Doctrine\\ODM\\MongoDB' => __DIR__.'/vendor/doctrine-mongodb/lib',
'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib',
'Doctrine\\DBAL\\Migrations' => __DIR__.'/vendor/doctrine-migrations/lib',
'Doctrine\\DBAL' => __DIR__.'/vendor/doctrine-dbal/lib',
'Doctrine' => __DIR__.'/vendor/doctrine/lib',
'Zend' => __DIR__.'/vendor/zend/library',
'Symfony' => __DIR__.'/src',
'Doctrine\\ODM\\MongoDB' => __DIR__.'/vendor/doctrine-mongodb/lib',
'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib',
'Doctrine\\DBAL\\Migrations' => __DIR__.'/vendor/doctrine-migrations/lib',
'Doctrine\\DBAL' => __DIR__.'/vendor/doctrine-dbal/lib',
'Doctrine\\ORM\\DataFixtures' => __DIR__.'/vendor/doctrine-orm-data-fixtures',
'Doctrine' => __DIR__.'/vendor/doctrine/lib',
'Zend' => __DIR__.'/vendor/zend/library',
));
$loader->registerPrefixes(array(
'Swift_' => __DIR__.'/vendor/swiftmailer/lib/classes',
Expand All @@ -26,4 +27,4 @@ set_include_path(
__DIR__.'/vendor/phing/classes'.PATH_SEPARATOR.
__DIR__.'/vendor/propel/runtime/lib'.PATH_SEPARATOR.
get_include_path()
);
);
3 changes: 3 additions & 0 deletions install_vendors.sh
Expand Up @@ -12,6 +12,9 @@ cd vendor
# Doctrine ORM
git clone git://github.com/doctrine/doctrine2.git doctrine

# Doctrine ORM Data Fixtures Extension
git clone git://github.com/doctrine/orm-data-fixtures doctrine-orm-data-fixtures

# Doctrine DBAL
git clone git://github.com/doctrine/dbal.git doctrine-dbal

Expand Down
Expand Up @@ -39,6 +39,7 @@ protected function configure()
->setDescription('Load data fixtures to your database.')
->addOption('fixtures', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY, 'The directory or file to load data fixtures from.')
->addOption('append', null, InputOption::PARAMETER_OPTIONAL, 'Whether or not to append the data fixtures.', false)
->addOption('em', null, InputOption::PARAMETER_REQUIRED, 'The entity manager to use for this command.')
->setHelp(<<<EOT
The <info>doctrine:data:load</info> command loads data fixtures from your bundles:
Expand All @@ -57,7 +58,10 @@ protected function configure()

protected function execute(InputInterface $input, OutputInterface $output)
{
$defaultEm = $this->container->getDoctrine_ORM_EntityManagerService();
$emName = $input->getOption('em');
$emName = $emName ? $emName : 'default';
$emServiceName = sprintf('doctrine.orm.%s_entity_manager', $emName);
$em = $this->container->get($emServiceName);
$dirOrFile = $input->getOption('fixtures');
if ($dirOrFile) {
$paths = is_array($dirOrFile) ? $dirOrFile : array($dirOrFile);
Expand All @@ -69,139 +73,19 @@ protected function execute(InputInterface $input, OutputInterface $output)
$namespace = str_replace('/', '\\', dirname($tmp));
$class = basename($tmp);

if (isset($bundleDirs[$namespace]) && is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Resources/data/fixtures/doctrine/orm')) {
if (isset($bundleDirs[$namespace]) && is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/DataFixtures/ORM')) {
$paths[] = $dir;
}
}
}

$files = array();
$loader = new \Doctrine\Common\DataFixtures\Loader();
foreach ($paths as $path) {
if (is_dir($path)) {
$finder = new Finder();
$found = iterator_to_array($finder
->files()
->name('*.php')
->in($path));
} else {
$found = array($path);
}
$files = array_merge($files, $found);
}

$ems = array();
$emEntities = array();
$files = array_unique($files);
foreach ($files as $file) {
$em = $defaultEm;
$output->writeln(sprintf('<info>Loading data fixtures from <comment>"%s"</comment></info>', $file));

$before = array_keys(get_defined_vars());
include($file);
$after = array_keys(get_defined_vars());
$new = array_diff($after, $before);
$params = $em->getConnection()->getParams();
$emName = isset($params['path']) ? $params['path']:$params['dbname'];

$ems[$emName] = $em;
$emEntities[$emName] = array();
$variables = array_values($new);

foreach ($variables as $variable) {
$value = $$variable;
if (!is_object($value) || $value instanceof \Doctrine\ORM\EntityManager) {
continue;
}
$emEntities[$emName][] = $value;
}
foreach ($ems as $emName => $em) {
if (!$input->getOption('append')) {
$output->writeln(sprintf('<info>Purging data from entity manager named <comment>"%s"</comment></info>', $emName));
$this->purgeEntityManager($em);
}

$entities = $emEntities[$emName];
$numEntities = count($entities);
$output->writeln(sprintf('<info>Persisting "%s" '.($numEntities > 1 ? 'entities' : 'entity').'</info>', count($entities)));

foreach ($entities as $entity) {
$em->persist($entity);
}
$output->writeln('<info>Flushing entity manager</info>');
$em->flush();
}
}
}

protected function purgeEntityManager(EntityManager $em)
{
$classes = array();
$metadatas = $em->getMetadataFactory()->getAllMetadata();

foreach ($metadatas as $metadata) {
if (!$metadata->isMappedSuperclass) {
$classes[] = $metadata;
}
$loader->loadFromDirectory($path);
}

$commitOrder = $this->getCommitOrder($em, $classes);

// Drop association tables first
$orderedTables = $this->getAssociationTables($commitOrder);

// Drop tables in reverse commit order
for ($i = count($commitOrder) - 1; $i >= 0; --$i) {
$class = $commitOrder[$i];

if (($class->isInheritanceTypeSingleTable() && $class->name != $class->rootEntityName)
|| $class->isMappedSuperclass) {
continue;
}

$orderedTables[] = $class->getTableName();
}

foreach($orderedTables as $tbl) {
$em->getConnection()->executeUpdate("DELETE FROM $tbl");
}
}

protected function getCommitOrder(EntityManager $em, array $classes)
{
$calc = new CommitOrderCalculator;

foreach ($classes as $class) {
$calc->addClass($class);

foreach ($class->associationMappings as $assoc) {
if ($assoc['isOwningSide']) {
$targetClass = $em->getClassMetadata($assoc['targetEntity']);

if ( ! $calc->hasClass($targetClass->name)) {
$calc->addClass($targetClass);
}

// add dependency ($targetClass before $class)
$calc->addDependency($targetClass, $class);
}
}
}

return $calc->getCommitOrder();
}

protected function getAssociationTables(array $classes)
{
$associationTables = array();

foreach ($classes as $class) {
foreach ($class->associationMappings as $assoc) {
if ($assoc['isOwningSide'] && $assoc['type'] == ClassMetadata::MANY_TO_MANY) {
$associationTables[] = $assoc['joinTable']['name'];
}
}
}

return $associationTables;
$fixtures = $loader->getFixtures();
$purger = new \Doctrine\Common\DataFixtures\Purger\ORMPurger($em);
$executor = new \Doctrine\Common\DataFixtures\Executor\ORMExecutor($em, $purger);
$executor->execute($fixtures, $input->getOption('append'));
}
}
}
9 changes: 5 additions & 4 deletions src/Symfony/Bundle/DoctrineBundle/Resources/config/dbal.xml
Expand Up @@ -7,15 +7,16 @@
<parameters>
<parameter key="doctrine.dbal.default_connection">default</parameter>
<parameter key="doctrine.dbal.connection_class">Doctrine\DBAL\Connection</parameter>

<parameter key="doctrine.dbal.logger.debug_class">Doctrine\DBAL\Logging\DebugStack</parameter>
<parameter key="doctrine.dbal.logger_class">Symfony\Bundle\DoctrineBundle\Logger\DbalLogger</parameter>
<parameter key="doctrine.data_collector.class">Symfony\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector</parameter>
<parameter key="doctrine.dbal.default_connection">default</parameter>
</parameters>

<services>
<service id="doctrine.dbal.logger.debug" class="Doctrine\DBAL\Logging\DebugStack" />
<service id="doctrine.dbal.logger.debug" class="%doctrine.dbal.logger.debug_class%" />

<service id="doctrine.dbal.logger" class="Symfony\Bundle\DoctrineBundle\Logger\DbalLogger">
<service id="doctrine.dbal.logger" class="%doctrine.dbal.logger_class%">
<argument type="service" id="logger" on-invalid="null" />
</service>

Expand All @@ -24,4 +25,4 @@
<argument type="service" id="doctrine.dbal.logger" />
</service>
</services>
</container>
</container>
9 changes: 4 additions & 5 deletions src/Symfony/Bundle/DoctrineBundle/Resources/config/orm.xml
Expand Up @@ -42,26 +42,25 @@

<services>
<!--- Annotation Metadata Driver Service -->
<service id="doctrine.orm.metadata_driver.annotation" class="Doctrine\ORM\Mapping\Driver\AnnotationDriver">
<service id="doctrine.orm.metadata_driver.annotation" class="%doctrine.orm.metadata.annotation_class%">
<argument type="service" id="doctrine.orm.metadata_driver.annotation.reader" />
<argument>%doctrine.orm.metadata_driver.entity_dirs%</argument>
</service>

<service id="doctrine.orm.metadata_driver.annotation.reader" class="Doctrine\Common\Annotations\AnnotationReader">
<call method="setDefaultAnnotationNamespace"><argument>%doctrine.orm.metadata.annotation_default_namespace%</argument></call>
<service id="doctrine.orm.metadata_driver.annotation.reader" class="%doctrine.orm.metadata.annotation_reader_class%">
<call method="setAnnotationNamespaceAlias">
<argument>Doctrine\ORM\Mapping\</argument>
<argument>orm</argument>
</call>
</service>

<!--- XML Metadata Driver Service -->
<service id="doctrine.orm.metadata_driver.xml" class="Doctrine\ORM\Mapping\Driver\XmlDriver">
<service id="doctrine.orm.metadata_driver.xml" class="%doctrine.orm.metadata.xml_class%">
<argument>%doctrine.orm.metadata_driver.mapping_dirs%</argument>
</service>

<!--- YAML Metadata Driver Service -->
<service id="doctrine.orm.metadata_driver.yml" class="Doctrine\ORM\Mapping\Driver\YamlDriver">
<service id="doctrine.orm.metadata_driver.yml" class="%doctrine.orm.metadata.yml_class%">
<argument>%doctrine.orm.metadata_driver.mapping_dirs%</argument>
</service>
</services>
Expand Down
62 changes: 62 additions & 0 deletions src/Symfony/Bundle/DoctrineBundle/Tests/ContainerTest.php
@@ -0,0 +1,62 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Bundle\DoctrineBundle\Tests;

use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

class ContainerTest extends TestCase
{
public function getContainer()
{
$container = new ContainerBuilder(new ParameterBag(array(
'kernel.bundle_dirs' => array(),
'kernel.bundles' => array(),
'kernel.cache_dir' => sys_get_temp_dir(),
)));
$loader = new DoctrineExtension();
$container->registerExtension($loader);
$loader->dbalLoad(array(), $container);
$loader->ormLoad(array(), $container);

$dumper = new PhpDumper($container);
$code = $dumper->dump();
eval(str_replace('<?php', null, $code));
return new \ProjectServiceContainer;
}

public function testContainer()
{
$container = $this->getContainer();
$this->assertInstanceOf('Doctrine\DBAL\Logging\DebugStack', $container->get('doctrine.dbal.logger.debug'));
$this->assertInstanceOf('Doctrine\DBAL\Logging\DebugStack', $container->get('doctrine.dbal.logger'));
$this->assertInstanceOf('Symfony\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector', $container->get('doctrine.data_collector'));
$this->assertInstanceOf('Doctrine\DBAL\Configuration', $container->get('doctrine.dbal.default_connection.configuration'));
$this->assertInstanceOf('Doctrine\Common\EventManager', $container->get('doctrine.dbal.default_connection.event_manager'));
$this->assertInstanceOf('Doctrine\DBAL\Connection', $container->get('doctrine.dbal.default_connection'));
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\AnnotationDriver', $container->get('doctrine.orm.metadata_driver.annotation'));
$this->assertInstanceOf('Doctrine\Common\Annotations\AnnotationReader', $container->get('doctrine.orm.metadata_driver.annotation.reader'));
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\XmlDriver', $container->get('doctrine.orm.metadata_driver.xml'));
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\YamlDriver', $container->get('doctrine.orm.metadata_driver.yml'));
$this->assertInstanceOf('Doctrine\ORM\Configuration', $container->get('doctrine.orm.default_configuration'));
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\DriverChain', $container->get('doctrine.orm.metadata_driver'));
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.orm.default_metadata_cache'));
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.orm.default_query_cache'));
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.orm.default_result_cache'));
$this->assertInstanceOf('Doctrine\ORM\EntityManager', $container->get('doctrine.orm.default_entity_manager'));
$this->assertInstanceOf('Doctrine\DBAL\Connection', $container->get('database_connection'));
$this->assertInstanceOf('Doctrine\ORM\EntityManager', $container->get('doctrine.orm.entity_manager'));
}
}
Expand Up @@ -21,16 +21,16 @@ protected function configure()
parent::configure();

$this
->setName('doctrine:odm:schema:create')
->setName('doctrine:mongodb:schema:create')
->addOption('dm', null, InputOption::PARAMETER_REQUIRED, 'The document manager to use for this command.')
->setHelp(<<<EOT
The <info>doctrine:odm:schema:create</info> command creates the default document manager's schema:
The <info>doctrine:mongodb:schema:create</info> command creates the default document manager's schema:
<info>./symfony doctrine:odm:schema:create</info>
<info>./symfony doctrine:mongodb:schema:create</info>
You can also optionally specify the name of a document manager to create the schema for:
<info>./symfony doctrine:odm:schema:create --dm=default</info>
<info>./symfony doctrine:mongodb:schema:create --dm=default</info>
EOT
);
}
Expand Down
Expand Up @@ -21,16 +21,16 @@ protected function configure()
parent::configure();

$this
->setName('doctrine:odm:schema:drop')
->setName('doctrine:mongodb:schema:drop')
->addOption('dm', null, InputOption::PARAMETER_REQUIRED, 'The document manager to use for this command.')
->setHelp(<<<EOT
The <info>doctrine:odm:schema:drop</info> command drops the default document manager's schema:
The <info>doctrine:mongodb:schema:drop</info> command drops the default document manager's schema:
<info>./symfony doctrine:odm:schema:drop</info>
<info>./symfony doctrine:mongodb:schema:drop</info>
You can also optionally specify the name of a document manager to drop the schema for:
<info>./symfony doctrine:odm:schema:drop --dm=default</info>
<info>./symfony doctrine:mongodb:schema:drop --dm=default</info>
EOT
);
}
Expand Down

0 comments on commit ff683a6

Please sign in to comment.