Skip to content

Commit ff683a6

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

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy