8000 Integrating new data fixtures code. · symfony/symfony@ff683a6 · GitHub
[go: up one dir, main page]

Skip to content

Commit ff683a6

Browse files
jwagefabpot
authored andcommitted
Integrating new data fixtures code.
1 parent 2525998 commit ff683a6

File tree

Expand file tree

12 files changed

+257
-156
lines changed

12 files changed

+257
-156
lines changed

autoload.php.dist

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ use Symfony\Component\HttpFoundation\UniversalClassLoader;
66

77
$loader = new UniversalClassLoader();
88
$loader->registerNamespaces(array(
9-
'Symfony' => __DIR__.'/src',
10-
'Doctrine\\ODM\\MongoDB' => __DIR__.'/vendor/doctrine-mongodb/lib',
11-
'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib',
12-
'Doctrine\\DBAL\\Migrations' => __DIR__.'/vendor/doctrine-migrations/lib',
13-
'Doctrine\\DBAL' => __DIR__.'/vendor/doctrine-dbal/lib',
14-
'Doctrine' => __DIR__.'/vendor/doctrine/lib',
15-
'Zend' => __DIR__.'/vendor/zend/library',
9+
'Symfony' => __DIR__.'/src',
10+
'Doctrine\\ODM\\MongoDB' => __DIR__.'/vendor/doctrine-mongodb/lib',
11+
'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib',
12+
'Doctrine\\DBAL\\Migrations' => __DIR__.'/vendor/doctrine-migrations/lib',
13+
'Doctrine\\DBAL' => __DIR__.'/vendor/doctrine-dbal/lib',
14+
'Doctrine\\ORM\\DataFixtures' => __DIR__.'/vendor/doctrine-orm-data-fixtures',
15+
'Doctrine' => __DIR__.'/vendor/doctrine/lib',
16+
'Zend' => __DIR__.'/vendor/zend/library',
1617
));
1718
$loader->registerPrefixes(array(
1819
'Swift_' => __DIR__.'/vendor/swiftmailer/lib/classes',
@@ -26,4 +27,4 @@ set_include_path(
2627
__DIR__.'/vendor/phing/classes'.PATH_SEPARATOR.
2728
__DIR__.'/vendor/propel/runtime/lib'.PATH_SEPARATOR.
2829
get_include_path()
29-
);
30+
);

install_vendors.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ cd vendor
1212
# Doctrine ORM
1313
git clone git://github.com/doctrine/doctrine2.git doctrine
1414

15+
# Doctrine ORM Data Fixtures Extension
16+
git clone git://github.com/doctrine/orm-data-fixtures doctrine-orm-data-fixtures
17+
1518
# Doctrine DBAL
1619
git clone git://github.com/doctrine/dbal.git doctrine-dbal
1720

src/Symfony/Bundle/DoctrineBundle/Command/LoadDataFixturesDoctrineCommand.php

Lines changed: 13 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ protected function configure()
3939
->setDescription('Load data fixtures to your database.')
4040
->addOption('fixtures', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY, 'The directory or file to load data fixtures from.')
4141
->addOption('append', null, InputOption::PARAMETER_OPTIONAL, 'Whether or not to append the data fixtures.', false)
42+
->addOption('em', null, InputOption::PARAMETER_REQUIRED, 'The entity manager to use for this command.')
4243
->setHelp(<<<EOT
4344
The <info>doctrine:data:load</info> command loads data fixtures from your bundles:
4445
@@ -57,7 +58,10 @@ protected function configure()
5758

5859
protected function execute(InputInterface $input, OutputInterface $output)
5960
{
60-
$defaultEm = $this->container->getDoctrine_ORM_EntityManagerService();
61+
$emName = $input->getOption('em');
62+
$emName = $emName ? $emName : 'default';
63+
$emServiceName = sprintf('doctrine.orm.%s_entity_manager', $emName);
64+
$em = $this->container->get($emServiceName);
6165
$dirOrFile = $input->getOption('fixtures');
6266
if ($dirOrFile) {
6367
$paths = is_array($dirOrFile) ? $dirOrFile : array($dirOrFile);
@@ -69,139 +73,19 @@ protected function execute(InputInterface $input, OutputInterface $output)
6973
$namespace = str_replace('/', '\\', dirname($tmp));
7074
$class = basename($tmp);
7175

72-
if (isset($bundleDirs[$namespace]) && is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Resources/data/fixtures/doctrine/orm')) {
76+
if (isset($bundleDirs[$namespace]) && is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/DataFixtures/ORM')) {
7377
$paths[] = $dir;
7478
}
7579
}
7680
}
7781

78-
$files = array();
82+
$loader = new \Doctrine\Common\DataFixtures\Loader();
7983
foreach ($paths as $path) {
80-
if (is_dir($path)) {
81-
$finder = new Finder();
82-
$found = iterator_to_array($finder
83-
->files()
84-
->name('*.php')
85-
->in($path));
86-
} else {
87-
$found = array($path);
88-
}
89-
$files = array_merge($files, $found);
90-
}
91-
92-
$ems = array();
93-
$emEntities = array();
94-
$files = array_unique($files);
95-
foreach ($files as $file) {
96-
$em = $defaultEm;
97-
$output->writeln(sprintf('<info>Loading data fixtures from <comment>"%s"</comment></info>', $file));
98-
99-
$before = array_keys(get_defined_vars());
100-
include($file);
101-
$after = array_keys(get_defined_vars());
102-
$new = array_diff($after, $before);
103-
$params = $em->getConnection()->getParams();
104-
$emName = isset($params['path']) ? $params['path']:$params['dbname'];
105-
106-
$ems[$emName] = $em;
107-
$emEntities[$emName] = array();
108-
$variables = array_values($new);
109-
110-
foreach ($variables as $variable) {
111-
$value = $$variable;
112-
if (!is_object($value) || $value instanceof \Doctrine\ORM\EntityManager) {
113-
continue;
114-
}
115-
$emEntities[$emName][] = $value;
116-
}
117-
foreach ($ems as $emName => $em) {
118-
if (!$input->getOption('append')) {
119-
$output->writeln(sprintf('<info>Purging data from entity manager named <comment>"%s"</comment></info>', $emName));
120-
$this->purgeEntityManager($em);
121-
}
122-
123-
$entities = $emEntities[$emName];
124-
$numEntities = count($entities);
125-
$output->writeln(sprintf('<info>Persisting "%s" '.($numEntities > 1 ? 'entities' : 'entity').'</info>', count($entities)));
126-
127-
foreach ($entities as $entity) {
128-
$em->persist($entity);
129-
}
130-
$output->writeln('<info>Flushing entity manager</info>');
131-
$em->flush();
132-
}
133-
}
134-
}
135-
136-
protected function purgeEntityManager(EntityManager $em)
137-
{
138-
$classes = array();
139-
$metadatas = $em->getMetadataFactory()->getAllMetadata();
140-
141-
foreach ($metadatas as $metadata) {
142-
if (!$metadata->isMappedSuperclass) {
143-
$classes[] = $metadata;
144-
}
84+
$loader->loadFromDirectory($path);
14585
}
146-
147-
$commitOrder = $this->getCommitOrder($em, $classes);
148-
149-
// Drop association tables first
150-
$orderedTables = $this->getAssociationTables($commitOrder);
151-
152-
// Drop tables in reverse commit order
153-
for ($i = count($commitOrder) - 1; $i >= 0; --$i) {
154-
$class = $commitOrder[$i];
155-
156-
if (($class->isInheritanceTypeSingleTable() && $class->name != $class->rootEntityName)
157-
|| $class->isMappedSuperclass) {
158-
continue;
159-
}
160-
161-
$orderedTables[] = $class->getTableName();
162-
}
163-
164-
foreach($orderedTables as $tbl) {
165-
$em->getConnection()->executeUpdate("DELETE FROM $tbl");
166-
}
167-
}
168-
169-
protected function getCommitOrder(EntityManager $em, array $classes)
170-
{
171-
$calc = new CommitOrderCalculator;
172-
173-
foreach ($classes as $class) {
174-
$calc->addClass($class);
175-
176-
foreach ($class->associationMappings as $assoc) {
177-
if ($assoc['isOwningSide']) {
178-
$targetClass = $em->getClassMetadata($assoc['targetEntity']);
179-
180-
if ( ! $calc->hasClass($targetClass->name)) {
181-
$calc->addClass($targetClass);
182-
}
183-
184-
// add dependency ($targetClass before $class)
185-
$calc->addDependency($targetClass, $class);
186-
}
187-
}
188-
}
189-
190-
return $calc->getCommitOrder();
191-
}
192-
193-
protected function getAssociationTables(array $classes)
194-
{
195-
$associationTables = array();
196-
197-
foreach ($classes as $class) {
198-
foreach ($class->associationMappings as $assoc) {
199-
if ($assoc['isOwningSide'] && $assoc['type'] == ClassMetadata::MANY_TO_MANY) {
200-
$associationTables[] = $assoc['joinTable']['name'];
201-
}
202-
}
203-
}
204-
205-
return $associationTables;
86+
$fixtures = $loader->getFixtures();
87+
$purger = new \Doctrine\Common\DataFixtures\Purger\ORMPurger($em);
88+
$executor = new \Doctrine\Common\DataFixtures\Executor\ORMExecutor($em, $purger);
89+
$executor->execute($fixtures, $input->getOption('append'));
20690
}
207-
}
91+
}

src/Symfony/Bundle/DoctrineBundle/Resources/config/dbal.xml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@
77
<parameters>
88
<parameter key="doctrine.dbal.default_connection">default</parameter>
99
<parameter key="doctrine.dbal.connection_class">Doctrine\DBAL\Connection</parameter>
10-
10+
<parameter key="doctrine.dbal.logger.debug_class">Doctrine\DBAL\Logging\DebugStack</parameter>
11+
<parameter key="doctrine.dbal.logger_class">Symfony\Bundle\DoctrineBundle\Logger\DbalLogger</parameter>
1112
<parameter key="doctrine.data_collector.class">Symfony\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector</parameter>
1213
<parameter key="doctrine.dbal.default_connection">default</parameter>
1314
</parameters>
1415

1516
<services>
16-
<service id="doctrine.dbal.logger.debug" class="Doctrine\DBAL\Logging\DebugStack" />
17+
<service id="doctrine.dbal.logger.debug" class="%doctrine.dbal.logger.debug_class%" />
1718

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

@@ -24,4 +25,4 @@
2425
<argument type="service" id="doctrine.dbal.logger" />
2526
</service>
2627
</services>
27-
</container>
28+
</container>

src/Symfony/Bundle/DoctrineBundle/Resources/config/orm.xml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,26 +42,25 @@
4242

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

50-
<service id="doctrine.orm.metadata_driver.annotation.reader" class="Doctrine\Common\Annotations\AnnotationReader">
51-
<call method="setDefaultAnnotationNamespace"><argument>%doctrine.orm.metadata.annotation_default_namespace%</argument></call>
50+
<service id="doctrine.orm.metadata_driver.annotation.reader" class="%doctrine.orm.metadata.annotation_reader_class%">
5251
<call method="setAnnotationNamespaceAlias">
5352
<argument>Doctrine\ORM\Mapping\</argument>
5453
<argument>orm</argument>
5554
</call>
5655
</service>
5756

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

6362
<!--- YAML Metadata Driver Service -->
64-
<service id="doctrine.orm.metadata_driver.yml" class="Doctrine\ORM\Mapping\Driver\YamlDriver">
63+
<service id="doctrine.orm.metadata_driver.yml" class="%doctrine.orm.metadata.yml_class%">
6564
<argument>%doctrine.orm.metadata_driver.mapping_dirs%</argument>
6665
</service>
6766
</services>
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bundle\DoctrineBundle\Tests;
13+
14+
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
15+
use Symfony\Component\DependencyInjection\ContainerBuilder;
16+
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
17+
use Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
18+
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
19+
20+
class ContainerTest extends TestCase
21+
{
22+
public function getContainer()
23+
{
24+
$container = new ContainerBuilder(new ParameterBag(array(
25+
'kernel.bundle_dirs' => array(),
26+
'kernel.bundles' => array(),
27+
'kernel.cache_dir' => sys_get_temp_dir(),
28+
)));
29+
$loader = new DoctrineExtension();
30+
$container->registerExtension($loader);
31+
$loader->dbalLoad(array(), $container);
32+
$loader->ormLoad(array(), $container);
33+
34+
$dumper = new PhpDumper($container);
35+
$code = $dumper->dump();
36+
eval(str_replace('<?php', null, $code));
37+
return new \ProjectServiceContainer;
38+
}
39+
40+
public function testContainer()
41+
{
42+
$container = $this->getContainer();
43+
$this->assertInstanceOf('Doctrine\DBAL\Logging\DebugStack', $container->get('doctrine.dbal.logger.debug'));
44+
$this->assertInstanceOf('Doctrine\DBAL\Logging\DebugStack', $container->get('doctrine.dbal.logger'));
45+
$this->assertInstanceOf('Symfony\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector', $container->get('doctrine.data_collector'));
46+
$this->assertInstanceOf('Doctrine\DBAL\Configuration', $container->get('doctrine.dbal.default_connection.configuration'));
47+
$this->assertInstanceOf('Doctrine\Common\EventManager', $container->get('doctrine.dbal.default_connection.event_manager'));
48+
$this->assertInstanceOf('Doctrine\DBAL\Connection', $container->get('doctrine.dbal.default_connection'));
49+
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\AnnotationDriver', $container->get('doctrine.orm.metadata_driver.annotation'));
50+
$this->assertInstanceOf('Doctrine\Common\Annotations\AnnotationReader', $container->get('doctrine.orm.metadata_driver.annotation.reader'));
51+
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\XmlDriver', $container->get('doctrine.orm.metadata_driver.xml'));
52+
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\YamlDriver', $container->get('doctrine.orm.metadata_driver.yml'));
53+
$this->assertInstanceOf('Doctrine\ORM\Configuration', $container->get('doctrine.orm.default_configuration'));
54+
$this->assertInstanceOf('Doctrine\ORM\Mapping\Driver\DriverChain', $container->get('doctrine.orm.metadata_driver'));
55+
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.orm.default_metadata_cache'));
56+
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.orm.default_query_cache'));
57+
$this->assertInstanceOf('Doctrine\Common\Cache\ArrayCache', $container->get('doctrine.orm.default_result_cache'));
58+
$this->assertInstanceOf('Doctrine\ORM\EntityManager', $container->get('doctrine.orm.default_entity_manager'));
59+
$this->assertInstanceOf('Doctrine\DBAL\Connection', $container->get('database_connection'));
60+
$this->assertInstanceOf('Doctrine\ORM\EntityManager', $container->get('doctrine.orm.entity_manager'));
61+
}
62+
}

src/Symfony/Bundle/DoctrineMongoDBBundle/Command/CreateSchemaDoctrineODMCommand.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@ protected function configure()
2121
parent::configure();
2222

2323
$this
24-
->setName('doctrine:odm:schema:create')
24+
->setName('doctrine:mongodb:schema:create')
2525
->addOption('dm', null, InputOption::PARAMETER_REQUIRED, 'The document manager to use for this command.')
2626
->setHelp(<<<EOT
27-
The <info>doctrine:odm:schema:create</info> command creates the default document manager's schema:
27+
The <info>doctrine:mongodb:schema:create</info> command creates the default document manager's schema:
2828
29-
<info>./symfony doctrine:odm:schema:create</info>
29+
<info>./symfony doctrine:mongodb:schema:create</info>
3030
3131
You can also optionally specify the name of a document manager to create the schema for:
3232
33-
<info>./symfony doctrine:odm:schema:create --dm=default</info>
33+
<info>./symfony doctrine:mongodb:schema:create --dm=default</info>
3434
EOT
3535
);
3636
}

src/Symfony/Bundle/DoctrineMongoDBBundle/Command/DropSchemaDoctrineODMCommand.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@ protected function configure()
2121
parent::configure();
2222

2323
$this
24-
->setName('doctrine:odm:schema:drop')
24+
->setName('doctrine:mongodb:schema:drop')
2525
->addOption('dm', null, InputOption::PARAMETER_REQUIRED, 'The document manager to use for this command.')
2626
->setHelp(<<<EOT
27-
The <info>doctrine:odm:schema:drop</info> command drops the default document manager's schema:
27+
The <info>doctrine:mongodb:schema:drop</info> command drops the default document manager's schema:
2828
29-
<info>./symfony doctrine:odm:schema:drop</info>
29+
<info>./symfony doctrine:mongodb:schema:drop</info>
3030
3131
You can also optionally specify the name of a document manager to drop the schema for:
3232
33-
<info>./symfony doctrine:odm:schema:drop --dm=default</info>
33+
<info>./symfony doctrine:mongodb:schema:drop --dm=default</info>
3434
EOT
3535
);
3636
}

0 commit comments

Comments
 (0)
0