Explorar o código

Add support for MySQL Session Init Listener, refactored driver and driverClass approach to follow the Doctrine DBAL factory more closely for this to work easily.

Benjamin Eberlei %!s(int64=14) %!d(string=hai) anos
pai
achega
ff91ea5f24

+ 23 - 2
src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php

@@ -123,7 +123,13 @@ class DoctrineExtension extends AbstractDoctrineExtension
         }
 
         if (isset($connection['driver'])) {
-            $driverOptions['driverClass'] = sprintf('Doctrine\\DBAL\\Driver\\%s\\Driver', $connection['driver']);
+            $driverOptions['driver'] = $connection['driver'];
+        }
+        if (isset($connection['driver-class'])) {
+            $driverOptions['driverClass'] = $connection['driver-class'];
+        }
+        if (isset($connection['driver_class'])) {
+            $driverOptions['driverClass'] = $connection['driver_class'];
         }
         if (isset($connection['wrapper-class'])) {
             $driverOptions['wrapperClass'] = $connection['wrapper-class'];
@@ -171,6 +177,21 @@ class DoctrineExtension extends AbstractDoctrineExtension
             $container->setAlias('doctrine.dbal.event_manager', sprintf('doctrine.dbal.%s_connection.event_manager', $connection['name']));
         }
 
+        if (isset($driverOptions['charset'])) {
+            if ( (isset($driverOptions['driver']) && stripos($driverOptions['driver'], 'mysql') !== false) ||
+                 (isset($driverOptions['driverClass']) && stripos($driverOptions['driverClass'], 'mysql') !== false)) {
+                $mysqlSessionInit = new Definition('%doctrine.dbal.events.mysql_session_init.class%');
+                $mysqlSessionInit->setArguments(array($driverOptions['charset']));
+                $mysqlSessionInit->addTag($eventManagerName);
+
+                $container->setDefinition(
+                    sprintf('doctrine.dbal.%s_connection.events.mysqlsessioninit', $connection['name']),
+                    $mysqlSessionInit
+                );
+                unset($driverOptions['charset']);
+            }
+        }
+
         $driverDef->setArguments(array(
             $driverOptions,
             new Reference(sprintf('doctrine.dbal.%s_connection.configuration', $connection['name'])),
@@ -188,7 +209,7 @@ class DoctrineExtension extends AbstractDoctrineExtension
     {
         $defaultConnectionName = $container->getParameter('doctrine.dbal.default_connection');
         $defaultConnection = array(
-            'driver'              => 'PDOMySql',
+            'driver'              => 'pdo_mysql',
             'user'                => 'root',
             'password'            => null,
             'host'                => 'localhost',

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

@@ -12,6 +12,8 @@
         <parameter key="doctrine.data_collector.class">Symfony\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector</parameter>
         <parameter key="doctrine.dbal.default_connection">default</parameter>
         <parameter key="doctrine.dbal.event_manager_class">Symfony\Bundle\DoctrineAbstractBundle\Event\EventManager</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>
     </parameters>
 
     <services>

+ 2 - 0
src/Symfony/Bundle/DoctrineBundle/Resources/config/schema/doctrine-1.0.xsd

@@ -19,6 +19,7 @@
         <xsd:attribute name="user" type="xsd:string" />
         <xsd:attribute name="password" type="xsd:string" />
         <xsd:attribute name="driver" type="xsd:string" />
+        <xsd:attribute name="driver-class" type="xsd:string" />
         <xsd:attribute name="options" type="xsd:string" />
         <xsd:attribute name="path" type="xsd:string" />
         <xsd:attribute name="unix-socket" type="xsd:string" />
@@ -40,6 +41,7 @@
         <xsd:attribute name="user" type="xsd:string" />
         <xsd:attribute name="password" type="xsd:string" />
         <xsd:attribute name="driver" type="xsd:string" />
+        <xsd:attribute name="driver-class" type="xsd:string" />
         <xsd:attribute name="options" type="xsd:string" />
         <xsd:attribute name="path" type="xsd:string" />
         <xsd:attribute name="unix-socket" type="xsd:string" />

+ 9 - 1
src/Symfony/Bundle/DoctrineBundle/Tests/ContainerTest.php

@@ -33,7 +33,14 @@ class ContainerTest extends TestCase
         )));
         $loader = new DoctrineExtension();
         $container->registerExtension($loader);
-        $loader->dbalLoad(array(), $container);
+        $loader->dbalLoad(array(
+            'connections' => array(
+                'default' => array(
+                    'driver' => 'pdo_mysql',
+                    'charset' => 'UTF-8',
+                )
+            )
+        ), $container);
         $loader->ormLoad(array('bundles' => array('YamlBundle' => array())), $container);
 
         $dumper = new PhpDumper($container);
@@ -62,5 +69,6 @@ class ContainerTest extends TestCase
         $this->assertInstanceOf('Doctrine\ORM\EntityManager', $container->get('doctrine.orm.entity_manager'));
         $this->assertInstanceOf('Symfony\Bundle\DoctrineAbstractBundle\Event\EventManager', $container->get('doctrine.orm.default_entity_manager.event_manager'));
         $this->assertInstanceOf('Symfony\Bundle\DoctrineAbstractBundle\Event\EventManager', $container->get('doctrine.dbal.event_manager'));
+        $this->assertInstanceOf('Doctrine\DBAL\Event\Listeners\MysqlSessionInit', $container->get('doctrine.dbal.default_connection.events.mysqlsessioninit'));
     }
 }

+ 16 - 5
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php

@@ -78,6 +78,17 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         // doctrine.dbal.sqlite_connection
         $arguments = $container->getDefinition('doctrine.dbal.sqlite_connection')->getArguments();
+        $config = $arguments[0];
+        $this->assertArrayHasKey('memory', $config);
+
+        // doctrine.dbal.oci8_connection
+        $arguments = $container->getDefinition('doctrine.dbal.oci_connection')->getArguments();
+        $config = $arguments[0];
+        $this->assertArrayHasKey('charset', $config);
+    }
+
+    public function testDbalLoadFromXmlSingleConnections()
+    {
         $container = $this->getContainer();
         $loader = new DoctrineExtension();
         $container->registerExtension($loader);
@@ -143,7 +154,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
 
         $args = $definition->getArguments();
-        $this->assertEquals('Doctrine\DBAL\Driver\PDOMySql\Driver', $args[0]['driverClass']);
+        $this->assertEquals('pdo_mysql', $args[0]['driver']);
         $this->assertEquals('localhost', $args[0]['host']);
         $this->assertEquals('root', $args[0]['user']);
         $this->assertEquals('doctrine.dbal.default_connection.configuration', (string) $args[1]);
@@ -218,7 +229,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         $this->assertDICConstructorArguments($definition, array(
             array(
-                'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
+                'driver' => 'pdo_mysql',
                 'driverOptions' => array(),
                 'host' => 'localhost',
                 'user' => 'root',
@@ -254,7 +265,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
         $this->assertDICConstructorArguments($definition, array(
             array(
-                'driverClass' => 'Doctrine\DBAL\Driver\PDOSqlite\Driver',
+                'driver' => 'pdo_sqlite',
                 'driverOptions' => array(),
                 'dbname' => 'sqlite_db',
                 'host' => 'localhost',
@@ -292,7 +303,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
 
         $args = $definition->getArguments();
-        $this->assertEquals('Doctrine\DBAL\Driver\PDOSqlite\Driver', $args[0]['driverClass']);
+        $this->assertEquals('pdo_sqlite', $args[0]['driver']);
         $this->assertEquals('localhost', $args[0]['host']);
         $this->assertEquals('sqlite_user', $args[0]['user']);
         $this->assertEquals('doctrine.dbal.conn1_connection.configuration', (string) $args[1]);
@@ -315,7 +326,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
 
         $args = $definition->getArguments();
-        $this->assertEquals('Doctrine\DBAL\Driver\PDOSqlite\Driver', $args[0]['driverClass']);
+        $this->assertEquals('pdo_sqlite', $args[0]['driver']);
         $this->assertEquals('localhost', $args[0]['host']);
         $this->assertEquals('sqlite_user', $args[0]['user']);
         $this->assertEquals('doctrine.dbal.conn2_connection.configuration', (string) $args[1]);

+ 2 - 2
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/Fixtures/config/xml/dbal_service_multiple_connections.xml

@@ -16,14 +16,14 @@
             unix-socket="/path/to/mysqld.sock" /><!--  -->
         <doctrine:connection
             id="sqlite"
-            driver="PDOSqlite"
+            driver="pdo_sqlite"
             dbname="sqlite_db"
             user="sqlite_user"
             password="sqlite_s3cr3t"
             memory="true" />
         <doctrine:connection
             id="oci"
-            driver="OCI8"
+            driver="oci8"
             dbname="oracle_db"
             user="oracle_user"
             password="oracle_s3cr3t"

+ 2 - 2
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/Fixtures/config/xml/orm_service_multiple_entity_managers.xml

@@ -11,14 +11,14 @@
         <doctrine:connections>
             <doctrine:connection
                 id="conn1"
-                driver="PDOSqlite"
+                driver="pdo_sqlite"
                 dbname="sqlite_db"
                 user="sqlite_user"
                 password="sqlite_s3cr3t"
                 memory="true" />
             <doctrine:connection
                 id="conn2"
-                driver="PDOSqlite"
+                driver="pdo_sqlite"
                 dbname="sqlite_db"
                 user="sqlite_user"
                 password="sqlite_s3cr3t"

+ 1 - 1
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/Fixtures/config/xml/orm_service_single_entity_manager.xml

@@ -11,7 +11,7 @@
         <doctrine:connections>
             <doctrine:connection
                 id="default"
-                driver="PDOSqlite"
+                driver="pdo_sqlite"
                 dbname="sqlite_db"
                 user="sqlite_user"
                 password="sqlite_s3cr3t"

+ 2 - 5
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/Fixtures/config/yml/dbal_service_multiple_connections.yml

@@ -6,13 +6,10 @@ doctrine.dbal:
       password: mysql_s3cr3t
       unix_socket: /path/to/mysqld.sock
     sqlite:
-      driver: PDOSqlite
-      dbname: sqlite_db
-      user: sqlite_user
-      password: sqlite_s3cr3t
+      driver: pdo_sqlite
       memory: true
     oci:
-      driver: OCI8
+      driver: oci8
       dbname: oracle_db
       user: oracle_user
       password: oracle_s3cr3t

+ 2 - 2
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/Fixtures/config/yml/orm_service_multiple_entity_managers.yml

@@ -1,13 +1,13 @@
 doctrine.dbal:
   connections:
     conn1:
-      driver: PDOSqlite
+      driver: pdo_sqlite
       dbname: sqlite_db
       user: sqlite_user
       password: sqlite_s3cr3t
       memory: true
     conn2:
-      driver: PDOSqlite
+      driver: pdo_sqlite
       dbname: sqlite_db
       user: sqlite_user
       password: sqlite_s3cr3t

+ 1 - 1
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/Fixtures/config/yml/orm_service_single_entity_manager.yml

@@ -1,7 +1,7 @@
 doctrine.dbal:
   connections:
     default:
-      driver: PDOSqlite
+      driver: pdo_sqlite
       dbname: sqlite_db
       user: sqlite_user
       password: sqlite_s3cr3t