Browse Source

[DoctrineBundle] Fixed multiple connections via XML

Fixed a bug (possibly introduced by e63ff6e04b37ca75f282) that prevented
multiple DBAL connections from being configured via an XML configuration file.

When multiple DBAL connections are specified via XML similar to:

    <doctrine:dbal>
      <doctrine:connections>
        <doctrine:connection
          id="conn1"
          ..
        />
        <doctrine:connection
          id="conn2"
          ..
        />
      </doctrine:connections>
    </doctrine:dbal>

XMLFileLoader produces a configuration similar to:

    array('connections' => array(
      'connection' => array(
        0 => array(
          'id' => 'conn1',
        ),
        1 => array(
          'id' => 'conn2',
        )
      )
    )

whereas when one connection is specified via XML similar to:

    <doctrine:dbal>
      <doctrine:connections>
        <doctrine:connection
          id="conn1"
          ..
        />
      </doctrine:connections>
    </doctrine:dbal>

XMLFileLoader produces a configuration similar to:

    array('connections' => array(
      'connection' => array(
        'id' => 'conn1',
      )
    )

This commit fixes DoctrineExtension to properly handle both cases, while still
supporting YAML configuration files.
Brandon Turner 15 năm trước cách đây
mục cha
commit
b828617420

+ 6 - 1
src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php

@@ -81,7 +81,12 @@ class DoctrineExtension extends Extension
 
         $connections = array();
         if (isset($config['connections'])) {
-            foreach ($config['connections'] as $name => $connection) {
+            $config_connections = $config['connections'];
+            if(isset($config['connections']['connection']) && isset($config['connections']['connection'][0])) {
+                // Multiple connections
+                $config_connections = $config['connections']['connection'];
+            }
+            foreach ($config_connections as $name => $connection) {
                 $connections[isset($connection['id']) ? $connection['id'] : $name] = $connection;
             }
         } else {

+ 60 - 0
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/DoctrineExtensionTest.php

@@ -14,6 +14,7 @@ namespace Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection;
 use Symfony\Bundle\DoctrineBundle\Tests\TestCase;
 use Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
 use Symfony\Components\DependencyInjection\BuilderConfiguration;
+use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
 
 class DoctrineExtensionTest extends TestCase
 {
@@ -46,4 +47,63 @@ class DoctrineExtensionTest extends TestCase
         $this->assertEquals('foo', $config['password']);
         $this->assertEquals('root', $config['user']);
     }
+
+    public function testDbalLoadFromXmlMultipleConnections()
+    {
+        $configuration = new BuilderConfiguration();
+        $loader = new DoctrineExtension(array(), array());
+        XmlFileLoader::registerExtension($loader);
+
+        $loadXml = new XmlFileLoader(__DIR__.'/Fixtures/xml');
+        $configuration->merge($loadXml->load('dbal_service_multiple_connections.xml'));
+        $configuration = $loader->dbalLoad(array(), $configuration);
+
+        // doctrine.dbal.mysql_connection
+        $arguments = $configuration->getDefinition('doctrine.dbal.mysql_connection')->getArguments();
+        $config = $arguments[0];
+
+        $this->assertEquals('mysql_s3cr3t', $config['password']);
+        $this->assertEquals('mysql_user', $config['user']);
+        $this->assertEquals('mysql_db', $config['dbname']);
+        $this->assertEquals('/path/to/mysqld.sock', $config['unix_socket']);
+
+        // doctrine.dbal.sqlite_connection
+        $arguments = $configuration->getDefinition('doctrine.dbal.sqlite_connection')->getArguments();
+        $config = $arguments[0];
+
+        $this->assertEquals('sqlite_s3cr3t', $config['password']);
+        $this->assertEquals('sqlite_user', $config['user']);
+        $this->assertEquals('sqlite_db', $config['dbname']);
+        $this->assertEquals(true, $config['memory']);
+
+        // doctrine.dbal.oci_connection
+        $arguments = $configuration->getDefinition('doctrine.dbal.oci_connection')->getArguments();
+        $config = $arguments[0];
+
+        $this->assertEquals('oracle_s3cr3t', $config['password']);
+        $this->assertEquals('oracle_user', $config['user']);
+        $this->assertEquals('oracle_db', $config['dbname']);
+        $this->assertEquals('utf8', $config['charset']);
+    }
+
+
+    public function testDbalLoadFromXmlSingleConnection()
+    {
+        $configuration = new BuilderConfiguration();
+        $loader = new DoctrineExtension(array(), array());
+        XmlFileLoader::registerExtension($loader);
+
+        $loadXml = new XmlFileLoader(__DIR__.'/Fixtures/xml');
+        $configuration->merge($loadXml->load('dbal_service_single_connection.xml'));
+        $configuration = $loader->dbalLoad(array(), $configuration);
+
+        // doctrine.dbal.mysql_connection
+        $arguments = $configuration->getDefinition('doctrine.dbal.mysql_connection')->getArguments();
+        $config = $arguments[0];
+
+        $this->assertEquals('mysql_s3cr3t', $config['password']);
+        $this->assertEquals('mysql_user', $config['user']);
+        $this->assertEquals('mysql_db', $config['dbname']);
+        $this->assertEquals('/path/to/mysqld.sock', $config['unix_socket']);
+    }
 }

+ 33 - 0
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/Fixtures/xml/dbal_service_multiple_connections.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://www.symfony-project.org/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:doctrine="http://www.symfony-project.org/schema/dic/doctrine"
+    xsi:schemaLocation="http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd
+                        http://www.symfony-project.org/schema/dic/doctrine http://www.symfony-project.org/schema/dic/doctrine/doctrine-1.0.xsd">
+
+    <doctrine:dbal>
+      <doctrine:connections>
+        <doctrine:connection
+            id="mysql"
+            dbname="mysql_db"
+            user="mysql_user"
+            password="mysql_s3cr3t"
+            unix_socket="/path/to/mysqld.sock" /><!--  -->
+        <doctrine:connection
+            id="sqlite"
+            driver="PDOSqlite"
+            dbname="sqlite_db"
+            user="sqlite_user"
+            password="sqlite_s3cr3t"
+            memory="true" />
+        <doctrine:connection
+            id="oci"
+            driver="OCI8"
+            dbname="oracle_db"
+            user="oracle_user"
+            password="oracle_s3cr3t"
+            charset="utf8" />
+      </doctrine:connections>
+    </doctrine:dbal>
+</container>

+ 19 - 0
src/Symfony/Bundle/DoctrineBundle/Tests/DependencyInjection/Fixtures/xml/dbal_service_single_connection.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://www.symfony-project.org/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:doctrine="http://www.symfony-project.org/schema/dic/doctrine"
+    xsi:schemaLocation="http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd
+                        http://www.symfony-project.org/schema/dic/doctrine http://www.symfony-project.org/schema/dic/doctrine/doctrine-1.0.xsd">
+
+    <doctrine:dbal>
+      <doctrine:connections>
+        <doctrine:connection
+            id="mysql"
+            dbname="mysql_db"
+            user="mysql_user"
+            password="mysql_s3cr3t"
+            unix_socket="/path/to/mysqld.sock" /><!--  -->
+      </doctrine:connections>
+    </doctrine:dbal>
+</container>