Skip to content

Commit

Permalink
[DoctrineBundle] converted DBAL definition templates to abstract defi…
Browse files Browse the repository at this point in the history
…nitions
  • Loading branch information
fabpot committed Apr 27, 2011
1 parent d350e01 commit 35a3244
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 65 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -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']));
Expand All @@ -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)),
))
;
}

/**
Expand Down
11 changes: 9 additions & 2 deletions src/Symfony/Bundle/DoctrineBundle/Resources/config/dbal.xml
Expand Up @@ -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>
Expand All @@ -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>
Expand Up @@ -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
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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']);
Expand Down Expand Up @@ -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());
Expand All @@ -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(
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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']);
Expand All @@ -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']);
Expand Down Expand Up @@ -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%');
Expand All @@ -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');
Expand All @@ -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());
Expand All @@ -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');

Expand Down Expand Up @@ -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.");

Expand Down Expand Up @@ -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(
Expand All @@ -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'));
Expand All @@ -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'));
Expand Down Expand Up @@ -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();
}
}
5 changes: 5 additions & 0 deletions src/Symfony/Bundle/DoctrineBundle/Tests/TestCase.php
Expand Up @@ -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
{
Expand Down Expand Up @@ -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;
}
}

6 comments on commit 35a3244

@stfalcon
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have problem with dbal encoding after this changes.
If reset symfony to previous commit then all works fine.

My dbal config:

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   pdo_mysql
                host:     localhost
                dbname:   stfalcon_com_development
                user:     root
                password: null
                charset:  UTF8

@stfalcon
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In queries log missing query "SET NAMES UTF8"

@fabpot
Copy link
Member Author

@fabpot fabpot commented on 35a3244 Apr 27, 2011

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have you tried with the latest version? I have fix a bug here: 32070f5

@fabpot
Copy link
Member Author

@fabpot fabpot commented on 35a3244 Apr 27, 2011

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, I understand what's going on now. I will provide a fix ASAP.

@fabpot
Copy link
Member Author

@fabpot fabpot commented on 35a3244 Apr 27, 2011

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be fixed now: 25ae70e

Can you confirm that it works for you?

@stfalcon
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep. it's work fine. tnx!

Please sign in to comment.