diff --git a/src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php b/src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php index c1ab37da0e57..9a46408b0f51 100755 --- a/src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php +++ b/src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php @@ -15,6 +15,7 @@ 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 @@ protected function dbalLoad(array $config, ContainerBuilder $container) */ 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 @@ protected function loadDbalConnection($name, array $connection, ContainerBuilder 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)), + )) + ; } /** diff --git a/src/Symfony/Bundle/DoctrineBundle/Resources/config/dbal.xml b/src/Symfony/Bundle/DoctrineBundle/Resources/config/dbal.xml index 8ea830d826a4..e242a8d646c7 100644 --- a/src/Symfony/Bundle/DoctrineBundle/Resources/config/dbal.xml +++ b/src/Symfony/Bundle/DoctrineBundle/Resources/config/dbal.xml @@ -6,11 +6,12 @@ default + Doctrine\DBAL\Connection Doctrine\DBAL\Logging\DebugStack Symfony\Bundle\DoctrineBundle\Logger\DbalLogger Doctrine\DBAL\Configuration Symfony\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector - Doctrine\Common\EventManager + Doctrine\Common\EventManager Symfony\Bundle\DoctrineBundle\ConnectionFactory Doctrine\DBAL\Event\Listeners\MysqlSessionInit Doctrine\DBAL\Event\Listeners\OracleSessionInit @@ -32,5 +33,11 @@ + + + + + + - \ No newline at end of file + diff --git a/src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php b/src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php index 83869d4b9ab7..e0db367bae63 100755 --- a/src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php +++ b/src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php @@ -18,6 +18,7 @@ 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 @@ public function testDbalLoadFromXmlMultipleConnections() $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 @@ public function testDbalLoadFromXmlSingleConnections() $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 @@ public function testDependencyInjectionConfigurationDefaults() $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 @@ public function testSingleEntityManagerConfiguration() $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 @@ public function testLoadSimpleSingleConnection() $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 @@ public function testLoadSingleConnection() $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 @@ public function testLoadMultipleConnections() $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 @@ public function testLoadMultipleConnections() $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 @@ public function testEntityManagerMetadataCacheDriverConfiguration() $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 @@ public function testEntityManagerMemcacheMetadataCacheDriverConfiguration() $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 @@ public function testDependencyInjectionImportsOverrideDefaults() $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 @@ public function testSingleEntityManagerMultipleMappingBundleDefinitions() $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 @@ public function testMultipleEntityManagersMappingBundleDefinitions() $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 @@ public function testSetTypes() $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 @@ public function testSetCustomFunctions() $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 @@ public function testAddCustomHydrationMode() $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 @@ protected function assertDICDefinitionMethodCallOnce($definition, $methodName, a $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(); + } } diff --git a/src/Symfony/Bundle/DoctrineBundle/Tests/TestCase.php b/src/Symfony/Bundle/DoctrineBundle/Tests/TestCase.php index 3e22d34b44f4..07fb5731d491 100644 --- a/src/Symfony/Bundle/DoctrineBundle/Tests/TestCase.php +++ b/src/Symfony/Bundle/DoctrineBundle/Tests/TestCase.php @@ -16,6 +16,7 @@ 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 @@ public function createYamlBundleTestContainer() $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; } }