Jelajahi Sumber

[DoctrineBundle] converted DBAL definition templates to abstract definitions

Fabien Potencier 14 tahun lalu
induk
melakukan
35a32440c7

+ 16 - 20
src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php

@@ -15,6 +15,7 @@ use Symfony\Component\DependencyInjection\Alias;
 use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\DefinitionDecorator;
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Bundle\DoctrineAbstractBundle\DependencyInjection\AbstractDoctrineExtension;
 use Symfony\Component\Config\FileLocator;
@@ -84,27 +85,19 @@ class DoctrineExtension extends AbstractDoctrineExtension
      */
     protected function loadDbalConnection($name, array $connection, ContainerBuilder $container)
     {
-        $containerDef = new Definition('%doctrine.dbal.configuration.class%');
-        $containerDef->setPublic(false);
+        // configuration
+        $configuration = $container->setDefinition(sprintf('doctrine.dbal.%s_connection.configuration', $name), new DefinitionDecorator('doctrine.dbal.connection.configuration'));
         if (isset($connection['logging']) && $connection['logging']) {
-            $containerDef->addMethodCall('setSQLLogger', array(new Reference('doctrine.dbal.logger')));
+            $configuration->addMethodCall('setSQLLogger', array(new Reference('doctrine.dbal.logger')));
             unset ($connection['logging']);
         }
-        $container->setDefinition(sprintf('doctrine.dbal.%s_connection.configuration', $name), $containerDef);
-
-        $driverDef = new Definition('Doctrine\DBAL\Connection');
-        $driverDef->setFactoryService('doctrine.dbal.connection_factory');
-        $driverDef->setFactoryMethod('createConnection');
-        $container->setDefinition(sprintf('doctrine.dbal.%s_connection', $name), $driverDef);
 
         // event manager
-        $eventManagerId = sprintf('doctrine.dbal.%s_connection.event_manager', $name);
-        $eventManagerDef = new Definition('%doctrine.dbal.event_manager.class%');
-        $eventManagerDef->setPublic(false);
-        $container->setDefinition($eventManagerId, $eventManagerDef);
+        $container->setDefinition(sprintf('doctrine.dbal.%s_connection.event_manager', $name), new DefinitionDecorator('doctrine.dbal.connection.event_manager'));
 
+        // connection
         if (isset($connection['charset'])) {
-            if ( (isset($connection['driver']) && stripos($connection['driver'], 'mysql') !== false) ||
+            if ((isset($connection['driver']) && stripos($connection['driver'], 'mysql') !== false) ||
                  (isset($connection['driverClass']) && stripos($connection['driverClass'], 'mysql') !== false)) {
                 $mysqlSessionInit = new Definition('%doctrine.dbal.events.mysql_session_init.class%');
                 $mysqlSessionInit->setArguments(array($connection['charset']));
@@ -121,14 +114,17 @@ class DoctrineExtension extends AbstractDoctrineExtension
 
         if (isset($connection['platform_service'])) {
             $connection['platform'] = new Reference($connection['platform_service']);
-            unset ($connection['platform_service']);
+            unset($connection['platform_service']);
         }
 
-        $driverDef->setArguments(array(
-            $connection,
-            new Reference(sprintf('doctrine.dbal.%s_connection.configuration', $name)),
-            new Reference(sprintf('doctrine.dbal.%s_connection.event_manager', $name))
-        ));
+        $container
+            ->setDefinition(sprintf('doctrine.dbal.%s_connection', $name), new DefinitionDecorator('doctrine.dbal.connection'))
+            ->setArguments(array(
+                $connection,
+                new Reference(sprintf('doctrine.dbal.%s_connection.configuration', $name)),
+                new Reference(sprintf('doctrine.dbal.%s_connection.event_manager', $name)),
+            ))
+        ;
     }
 
     /**

+ 9 - 2
src/Symfony/Bundle/DoctrineBundle/Resources/config/dbal.xml

@@ -6,11 +6,12 @@
 
     <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.dbal.configuration.class">Doctrine\DBAL\Configuration</parameter>
         <parameter key="doctrine.data_collector.class">Symfony\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector</parameter>
-        <parameter key="doctrine.dbal.event_manager.class">Doctrine\Common\EventManager</parameter>
+        <parameter key="doctrine.dbal.connection.event_manager.class">Doctrine\Common\EventManager</parameter>
         <parameter key="doctrine.dbal.connection_factory.class">Symfony\Bundle\DoctrineBundle\ConnectionFactory</parameter>
         <parameter key="doctrine.dbal.events.mysql_session_init.class">Doctrine\DBAL\Event\Listeners\MysqlSessionInit</parameter>
         <parameter key="doctrine.dbal.events.oracle_session_init.class">Doctrine\DBAL\Event\Listeners\OracleSessionInit</parameter>
@@ -32,5 +33,11 @@
         <service id="doctrine.dbal.connection_factory" class="%doctrine.dbal.connection_factory.class%">
             <argument /> <!-- Types -->
         </service>
+
+        <service id="doctrine.dbal.connection" class="%doctrine.dbal.connection.class%" factory-service="doctrine.dbal.connection_factory" factory-method="createConnection" public="false" abstract="true" />
+
+        <service id="doctrine.dbal.connection.event_manager" class="%doctrine.dbal.connection.event_manager.class%" public="false" abstract="true" />
+
+        <service id="doctrine.dbal.connection.configuration" class="%doctrine.dbal.configuration.class%" public="false" abstract="true" />
     </services>
-</container>
+</container>

+ 29 - 43
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php

@@ -18,6 +18,7 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
 use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
 use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
 use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass;
 use Symfony\Component\Config\FileLocator;
 
 abstract class AbstractDoctrineExtensionTest extends TestCase
@@ -59,9 +60,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $loadXml->load('dbal_service_multiple_connections.xml');
         $loader->load(array(array()), $container);
 
-        $container->getCompilerPassConfig()->setOptimizationPasses(array());
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         // doctrine.dbal.mysql_connection
         $arguments = $container->getDefinition('doctrine.dbal.mysql_connection')->getArguments();
@@ -93,9 +92,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $loadXml->load('dbal_service_single_connection.xml');
         $loader->load(array(array()), $container);
 
-        $container->getCompilerPassConfig()->setOptimizationPasses(array());
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         // doctrine.dbal.mysql_connection
         $arguments = $container->getDefinition('doctrine.dbal.mysql_connection')->getArguments();
@@ -144,9 +141,10 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         $container = $this->getContainer();
         $loader->load(array(array('dbal' => null, 'orm' => $config)), $container);
+        $this->compileContainer($container);
 
         $definition = $container->getDefinition('doctrine.dbal.default_connection');
-        $this->assertEquals('Doctrine\DBAL\Connection', $definition->getClass());
+        $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
 
         $args = $definition->getArguments();
         $this->assertEquals('pdo_mysql', $args[0]['driver']);
@@ -192,9 +190,10 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $loader = new DoctrineExtension();
 
         $loader->load(array(array('dbal' => null, 'orm' => array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('YamlBundle' => array())))))), $container);
+        $this->compileContainer($container);
 
         $definition = $container->getDefinition('doctrine.dbal.default_connection');
-        $this->assertEquals('Doctrine\DBAL\Connection', $definition->getClass());
+        $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
 
         $definition = $container->getDefinition('doctrine.orm.default_entity_manager');
         $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
@@ -215,12 +214,10 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         $this->loadFromFile($container, 'orm_service_simple_single_entity_manager');
 
-        $container->getCompilerPassConfig()->setOptimizationPasses(array());
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         $definition = $container->getDefinition('doctrine.dbal.default_connection');
-        $this->assertEquals('Doctrine\DBAL\Connection', $definition->getClass());
+        $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
 
         $this->assertDICConstructorArguments($definition, array(
             array(
@@ -255,12 +252,10 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         $this->loadFromFile($container, 'orm_service_single_entity_manager');
 
-        $container->getCompilerPassConfig()->setOptimizationPasses(array());
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         $definition = $container->getDefinition('doctrine.dbal.default_connection');
-        $this->assertEquals('Doctrine\DBAL\Connection', $definition->getClass());
+        $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
 
         $this->assertDICConstructorArguments($definition, array(
             array(
@@ -297,12 +292,10 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         $this->loadFromFile($container, 'orm_service_multiple_entity_managers');
 
-        $container->getCompilerPassConfig()->setOptimizationPasses(array());
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         $definition = $container->getDefinition('doctrine.dbal.conn1_connection');
-        $this->assertEquals('Doctrine\DBAL\Connection', $definition->getClass());
+        $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
 
         $args = $definition->getArguments();
         $this->assertEquals('pdo_sqlite', $args[0]['driver']);
@@ -326,7 +319,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $this->assertEquals('doctrine.orm.em1_configuration', (string) $arguments[1]);
 
         $definition = $container->getDefinition('doctrine.dbal.conn2_connection');
-        $this->assertEquals('Doctrine\DBAL\Connection', $definition->getClass());
+        $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
 
         $args = $definition->getArguments();
         $this->assertEquals('pdo_sqlite', $args[0]['driver']);
@@ -473,9 +466,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         $this->loadFromFile($container, 'orm_service_multiple_entity_managers');
 
-        $container->getCompilerPassConfig()->setOptimizationPasses(array());
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         $definition = $container->getDefinition('doctrine.orm.em1_metadata_cache');
         $this->assertDICDefinitionClass($definition, '%doctrine.orm.cache.xcache.class%');
@@ -492,9 +483,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         $this->loadFromFile($container, 'orm_service_simple_single_entity_manager');
 
-        $container->getCompilerPassConfig()->setOptimizationPasses(array());
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         $definition = $container->getDefinition('doctrine.orm.default_metadata_cache');
         $this->assertDICDefinitionClass($definition, 'Doctrine\Common\Cache\MemcacheCache');
@@ -517,9 +506,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         $this->loadFromFile($container, 'orm_imports');
 
-        $container->getCompilerPassConfig()->setOptimizationPasses(array());
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         $cacheDefinition = $container->getDefinition('doctrine.orm.default_metadata_cache');
         $this->assertEquals('%doctrine.orm.cache.apc.class%', $cacheDefinition->getClass());
@@ -537,8 +524,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         $this->loadFromFile($container, 'orm_single_em_bundle_mappings');
 
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         $definition = $container->getDefinition('doctrine.orm.default_metadata_driver');
 
@@ -583,8 +569,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         $this->loadFromFile($container, 'orm_multiple_em_bundle_mappings');
 
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         $this->assertEquals(array("em1", "em2"), $container->getParameter('doctrine.orm.entity_managers'), "Set of the existing EntityManagers names is incorrect.");
 
@@ -642,9 +627,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $loader = new DoctrineExtension();
         $container->registerExtension($loader);
         $this->loadFromFile($container, 'dbal_types');
-        $container->getCompilerPassConfig()->setOptimizationPasses(array());
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         $arguments = $container->getDefinition('doctrine.dbal.connection_factory')->getArguments();
         $this->assertEquals(
@@ -660,9 +643,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $loader = new DoctrineExtension();
         $container->registerExtension($loader);
         $this->loadFromFile($container, 'orm_functions');
-        $container->getCompilerPassConfig()->setOptimizationPasses(array());
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         $definition = $container->getDefinition('doctrine.orm.default_configuration');
         $this->assertDICDefinitionMethodCallOnce($definition, 'addCustomStringFunction', array('test_string', 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestStringFunction'));
@@ -677,9 +658,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $loader = new DoctrineExtension();
         $container->registerExtension($loader);
         $this->loadFromFile($container, 'orm_hydration_mode');
-        $container->getCompilerPassConfig()->setOptimizationPasses(array());
-        $container->getCompilerPassConfig()->setRemovingPasses(array());
-        $container->compile();
+        $this->compileContainer($container);
 
         $definition = $container->getDefinition('doctrine.orm.default_configuration');
         $this->assertDICDefinitionMethodCallOnce($definition, 'addCustomHydrationMode', array('test_hydrator', 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestHydrator'));
@@ -760,4 +739,11 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
             $this->fail("Method '" . $methodName . "' is expected to be called once, definition does not contain a call though.");
         }
     }
+
+    protected function compileContainer(ContainerBuilder $container)
+    {
+        $container->getCompilerPassConfig()->setOptimizationPasses(array(new ResolveDefinitionTemplatesPass()));
+        $container->getCompilerPassConfig()->setRemovingPasses(array());
+        $container->compile();
+    }
 }

+ 5 - 0
src/Symfony/Bundle/DoctrineBundle/Tests/TestCase.php

@@ -16,6 +16,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
 use Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
 use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
+use Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass;
 
 class TestCase extends \PHPUnit_Framework_TestCase
 {
@@ -85,6 +86,10 @@ class TestCase extends \PHPUnit_Framework_TestCase
 
         $container->setDefinition('my.platform', new \Symfony\Component\DependencyInjection\Definition('Doctrine\DBAL\Platforms\MySqlPlatform'));
 
+        $container->getCompilerPassConfig()->setOptimizationPasses(array(new ResolveDefinitionTemplatesPass()));
+        $container->getCompilerPassConfig()->setRemovingPasses(array());
+        $container->compile();
+
         return $container;
     }
 }