Ver Fonte

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 há 14 anos atrás
pai
commit
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