فهرست منبع

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 14 سال پیش
والد
کامیت
ff91ea5f24

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

@@ -123,7 +123,13 @@ class DoctrineExtension extends AbstractDoctrineExtension
         }
         }
 
 
         if (isset($connection['driver'])) {
         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'])) {
         if (isset($connection['wrapper-class'])) {
             $driverOptions['wrapperClass'] = $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']));
             $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(
         $driverDef->setArguments(array(
             $driverOptions,
             $driverOptions,
             new Reference(sprintf('doctrine.dbal.%s_connection.configuration', $connection['name'])),
             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');
         $defaultConnectionName = $container->getParameter('doctrine.dbal.default_connection');
         $defaultConnection = array(
         $defaultConnection = array(
-            'driver'              => 'PDOMySql',
+            'driver'              => 'pdo_mysql',
             'user'                => 'root',
             'user'                => 'root',
             'password'            => null,
             'password'            => null,
             'host'                => 'localhost',
             '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.data_collector.class">Symfony\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector</parameter>
         <parameter key="doctrine.dbal.default_connection">default</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.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>
     </parameters>
 
 
     <services>
     <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="user" type="xsd:string" />
         <xsd:attribute name="password" type="xsd:string" />
         <xsd:attribute name="password" type="xsd:string" />
         <xsd:attribute name="driver" 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="options" type="xsd:string" />
         <xsd:attribute name="path" type="xsd:string" />
         <xsd:attribute name="path" type="xsd:string" />
         <xsd:attribute name="unix-socket" 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="user" type="xsd:string" />
         <xsd:attribute name="password" type="xsd:string" />
         <xsd:attribute name="password" type="xsd:string" />
         <xsd:attribute name="driver" 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="options" type="xsd:string" />
         <xsd:attribute name="path" type="xsd:string" />
         <xsd:attribute name="path" type="xsd:string" />
         <xsd:attribute name="unix-socket" 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();
         $loader = new DoctrineExtension();
         $container->registerExtension($loader);
         $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);
         $loader->ormLoad(array('bundles' => array('YamlBundle' => array())), $container);
 
 
         $dumper = new PhpDumper($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('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.orm.default_entity_manager.event_manager'));
         $this->assertInstanceOf('Symfony\Bundle\DoctrineAbstractBundle\Event\EventManager', $container->get('doctrine.dbal.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
         // doctrine.dbal.sqlite_connection
         $arguments = $container->getDefinition('doctrine.dbal.sqlite_connection')->getArguments();
         $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();
         $container = $this->getContainer();
         $loader = new DoctrineExtension();
         $loader = new DoctrineExtension();
         $container->registerExtension($loader);
         $container->registerExtension($loader);
@@ -143,7 +154,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
         $this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
 
 
         $args = $definition->getArguments();
         $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('localhost', $args[0]['host']);
         $this->assertEquals('root', $args[0]['user']);
         $this->assertEquals('root', $args[0]['user']);
         $this->assertEquals('doctrine.dbal.default_connection.configuration', (string) $args[1]);
         $this->assertEquals('doctrine.dbal.default_connection.configuration', (string) $args[1]);
@@ -218,7 +229,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
 
         $this->assertDICConstructorArguments($definition, array(
         $this->assertDICConstructorArguments($definition, array(
             array(
             array(
-                'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
+                'driver' => 'pdo_mysql',
                 'driverOptions' => array(),
                 'driverOptions' => array(),
                 'host' => 'localhost',
                 'host' => 'localhost',
                 'user' => 'root',
                 'user' => 'root',
@@ -254,7 +265,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
 
 
         $this->assertDICConstructorArguments($definition, array(
         $this->assertDICConstructorArguments($definition, array(
             array(
             array(
-                'driverClass' => 'Doctrine\DBAL\Driver\PDOSqlite\Driver',
+                'driver' => 'pdo_sqlite',
                 'driverOptions' => array(),
                 'driverOptions' => array(),
                 'dbname' => 'sqlite_db',
                 'dbname' => 'sqlite_db',
                 'host' => 'localhost',
                 'host' => 'localhost',
@@ -292,7 +303,7 @@ abstract class AbstractDoctrineExtensionTest extends TestCase
         $this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
         $this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
 
 
         $args = $definition->getArguments();
         $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('localhost', $args[0]['host']);
         $this->assertEquals('sqlite_user', $args[0]['user']);
         $this->assertEquals('sqlite_user', $args[0]['user']);
         $this->assertEquals('doctrine.dbal.conn1_connection.configuration', (string) $args[1]);
         $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());
         $this->assertEquals('Doctrine\DBAL\DriverManager', $definition->getClass());
 
 
         $args = $definition->getArguments();
         $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('localhost', $args[0]['host']);
         $this->assertEquals('sqlite_user', $args[0]['user']);
         $this->assertEquals('sqlite_user', $args[0]['user']);
         $this->assertEquals('doctrine.dbal.conn2_connection.configuration', (string) $args[1]);
         $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" /><!--  -->
             unix-socket="/path/to/mysqld.sock" /><!--  -->
         <doctrine:connection
         <doctrine:connection
             id="sqlite"
             id="sqlite"
-            driver="PDOSqlite"
+            driver="pdo_sqlite"
             dbname="sqlite_db"
             dbname="sqlite_db"
             user="sqlite_user"
             user="sqlite_user"
             password="sqlite_s3cr3t"
             password="sqlite_s3cr3t"
             memory="true" />
             memory="true" />
         <doctrine:connection
         <doctrine:connection
             id="oci"
             id="oci"
-            driver="OCI8"
+            driver="oci8"
             dbname="oracle_db"
             dbname="oracle_db"
             user="oracle_user"
             user="oracle_user"
             password="oracle_s3cr3t"
             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:connections>
             <doctrine:connection
             <doctrine:connection
                 id="conn1"
                 id="conn1"
-                driver="PDOSqlite"
+                driver="pdo_sqlite"
                 dbname="sqlite_db"
                 dbname="sqlite_db"
                 user="sqlite_user"
                 user="sqlite_user"
                 password="sqlite_s3cr3t"
                 password="sqlite_s3cr3t"
                 memory="true" />
                 memory="true" />
             <doctrine:connection
             <doctrine:connection
                 id="conn2"
                 id="conn2"
-                driver="PDOSqlite"
+                driver="pdo_sqlite"
                 dbname="sqlite_db"
                 dbname="sqlite_db"
                 user="sqlite_user"
                 user="sqlite_user"
                 password="sqlite_s3cr3t"
                 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:connections>
             <doctrine:connection
             <doctrine:connection
                 id="default"
                 id="default"
-                driver="PDOSqlite"
+                driver="pdo_sqlite"
                 dbname="sqlite_db"
                 dbname="sqlite_db"
                 user="sqlite_user"
                 user="sqlite_user"
                 password="sqlite_s3cr3t"
                 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
       password: mysql_s3cr3t
       unix_socket: /path/to/mysqld.sock
       unix_socket: /path/to/mysqld.sock
     sqlite:
     sqlite:
-      driver: PDOSqlite
-      dbname: sqlite_db
-      user: sqlite_user
-      password: sqlite_s3cr3t
+      driver: pdo_sqlite
       memory: true
       memory: true
     oci:
     oci:
-      driver: OCI8
+      driver: oci8
       dbname: oracle_db
       dbname: oracle_db
       user: oracle_user
       user: oracle_user
       password: oracle_s3cr3t
       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:
 doctrine.dbal:
   connections:
   connections:
     conn1:
     conn1:
-      driver: PDOSqlite
+      driver: pdo_sqlite
       dbname: sqlite_db
       dbname: sqlite_db
       user: sqlite_user
       user: sqlite_user
       password: sqlite_s3cr3t
       password: sqlite_s3cr3t
       memory: true
       memory: true
     conn2:
     conn2:
-      driver: PDOSqlite
+      driver: pdo_sqlite
       dbname: sqlite_db
       dbname: sqlite_db
       user: sqlite_user
       user: sqlite_user
       password: sqlite_s3cr3t
       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:
 doctrine.dbal:
   connections:
   connections:
     default:
     default:
-      driver: PDOSqlite
+      driver: pdo_sqlite
       dbname: sqlite_db
       dbname: sqlite_db
       user: sqlite_user
       user: sqlite_user
       password: sqlite_s3cr3t
       password: sqlite_s3cr3t