diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php
index e4c0078b8..32e8ffa0d 100644
--- a/DependencyInjection/Configuration.php
+++ b/DependencyInjection/Configuration.php
@@ -132,6 +132,7 @@ private function getDbalConnectionsNode()
->fixXmlConfig('mapping_type')
->fixXmlConfig('slave')
->fixXmlConfig('shard')
+ ->fixXmlConfig('default_table_option')
->children()
->scalarNode('driver')->defaultValue('pdo_mysql')->end()
->scalarNode('platform_service')->end()
@@ -153,6 +154,11 @@ private function getDbalConnectionsNode()
->useAttributeAsKey('name')
->prototype('scalar')->end()
->end()
+ ->arrayNode('default_table_options')
+ ->info("This option is used by the schema-tool and affects generated SQL. Possible keys include 'charset','collate', and 'engine'.")
+ ->useAttributeAsKey('name')
+ ->prototype('scalar')->end()
+ ->end()
->end()
;
diff --git a/DependencyInjection/DoctrineExtension.php b/DependencyInjection/DoctrineExtension.php
index 51dfce608..45f6cb051 100644
--- a/DependencyInjection/DoctrineExtension.php
+++ b/DependencyInjection/DoctrineExtension.php
@@ -254,6 +254,7 @@ protected function getConnectionOptions($connection)
'keep_slave' => 'keepSlave',
'shard_choser' => 'shardChoser',
'server_version' => 'serverVersion',
+ 'default_table_options' => 'defaultTableOptions',
) as $old => $new) {
if (isset($options[$old])) {
$options[$new] = $options[$old];
diff --git a/Resources/config/schema/doctrine-1.0.xsd b/Resources/config/schema/doctrine-1.0.xsd
index f783f287c..40894c48f 100644
--- a/Resources/config/schema/doctrine-1.0.xsd
+++ b/Resources/config/schema/doctrine-1.0.xsd
@@ -68,6 +68,7 @@
+
diff --git a/Resources/doc/configuration.rst b/Resources/doc/configuration.rst
index ec32b8041..9b87bcf34 100644
--- a/Resources/doc/configuration.rst
+++ b/Resources/doc/configuration.rst
@@ -96,6 +96,13 @@ Configuration Reference
# example
# enum: string
+ default_table_options:
+ # Affects schema-tool. If absent, DBAL chooses defaults
+ # based on the platform. Examples here are for MySQL.
+ # charset: utf8
+ # collate: utf8_unicode_ci
+ # engine: InnoDB
+
slaves:
# A collection of named slave connections (e.g. slave1, slave2)
slave1:
@@ -414,6 +421,11 @@ Configuration Reference
string
+
+ utf8
+ utf8_unicode_ci
+ InnoDB
+
@@ -840,6 +852,12 @@ can configure. The following block shows all possible configuration keys:
enum: string
types:
custom: Acme\HelloBundle\MyCustomType
+ default_table_options:
+ # Affects schema-tool. If absent, DBAL chooses defaults
+ # based on the platform.
+ charset: utf8
+ collate: utf8_unicode_ci
+ engine: InnoDB
.. code-block:: xml
@@ -878,6 +896,9 @@ can configure. The following block shows all possible configuration keys:
>
bar
string
+ utf8
+ utf8_unicode_ci
+ InnoDB
Acme\HelloBundle\MyCustomType
diff --git a/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php b/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php
index 8647da15f..832e1da05 100644
--- a/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php
+++ b/Tests/DependencyInjection/AbstractDoctrineExtensionTest.php
@@ -114,7 +114,11 @@ public function testDbalLoadSingleMasterSlaveConnection()
$this->assertEquals('Doctrine\\DBAL\\Connections\\MasterSlaveConnection', $param['wrapperClass']);
$this->assertTrue($param['keepSlave']);
$this->assertEquals(
- array('user' => 'mysql_user', 'password' => 'mysql_s3cr3t', 'port' => null, 'dbname' => 'mysql_db', 'host' => 'localhost', 'unix_socket' => '/path/to/mysqld.sock'),
+ array('user' => 'mysql_user', 'password' => 'mysql_s3cr3t',
+ 'port' => null, 'dbname' => 'mysql_db', 'host' => 'localhost',
+ 'unix_socket' => '/path/to/mysqld.sock',
+ 'defaultTableOptions' => array(),
+ ),
$param['master']
);
$this->assertEquals(
@@ -136,7 +140,11 @@ public function testDbalLoadPoolShardingConnection()
$this->assertEquals('Doctrine\\DBAL\\Sharding\\PoolingShardConnection', $param['wrapperClass']);
$this->assertEquals(new Reference('foo.shard_choser'), $param['shardChoser']);
$this->assertEquals(
- array('user' => 'mysql_user', 'password' => 'mysql_s3cr3t', 'port' => null, 'dbname' => 'mysql_db', 'host' => 'localhost', 'unix_socket' => '/path/to/mysqld.sock'),
+ array('user' => 'mysql_user', 'password' => 'mysql_s3cr3t',
+ 'port' => null, 'dbname' => 'mysql_db', 'host' => 'localhost',
+ 'unix_socket' => '/path/to/mysqld.sock',
+ 'defaultTableOptions' => array(),
+ ),
$param['global']
);
$this->assertEquals(
@@ -163,6 +171,7 @@ public function testLoadSimpleSingleConnection()
'password' => null,
'driver' => 'pdo_mysql',
'driverOptions' => array(),
+ 'defaultTableOptions' => array(),
),
new Reference('doctrine.dbal.default_connection.configuration'),
new Reference('doctrine.dbal.default_connection.event_manager'),
@@ -202,6 +211,7 @@ public function testLoadSimpleSingleConnectionWithoutDbName()
'password' => null,
'driver' => 'pdo_mysql',
'driverOptions' => array(),
+ 'defaultTableOptions' => array(),
),
new Reference('doctrine.dbal.default_connection.configuration'),
new Reference('doctrine.dbal.default_connection.event_manager'),
@@ -241,6 +251,7 @@ public function testLoadSingleConnection()
'password' => 'sqlite_s3cr3t',
'dbname' => 'sqlite_db',
'memory' => true,
+ 'defaultTableOptions' => array(),
),
new Reference('doctrine.dbal.default_connection.configuration'),
new Reference('doctrine.dbal.default_connection.event_manager'),
@@ -461,6 +472,26 @@ public function testMultipleEntityManagersMappingBundleDefinitions()
));
}
+ public function testSingleEntityManagerDefaultTableOptions()
+ {
+ $container = $this->loadContainer('orm_single_em_default_table_options', array('YamlBundle', 'AnnotationsBundle', 'XmlBundle'));
+
+ $param = $container->getDefinition('doctrine.dbal.default_connection')->getArgument(0);
+
+ $this->assertArrayHasKey('defaultTableOptions',$param);
+
+ $defaults = $param['defaultTableOptions'];
+
+ $this->assertArrayHasKey('charset', $defaults);
+ $this->assertArrayHasKey('collate', $defaults);
+ $this->assertArrayHasKey('engine', $defaults);
+
+ $this->assertEquals('utf8mb4',$defaults['charset']);
+ $this->assertEquals('utf8mb4_unicode_ci',$defaults['collate']);
+ $this->assertEquals('InnoDB',$defaults['engine']);
+
+ }
+
public function testSetTypes()
{
$container = $this->loadContainer('dbal_types');
diff --git a/Tests/DependencyInjection/Fixtures/config/xml/orm_single_em_default_table_options.xml b/Tests/DependencyInjection/Fixtures/config/xml/orm_single_em_default_table_options.xml
new file mode 100644
index 000000000..cdbe1bddd
--- /dev/null
+++ b/Tests/DependencyInjection/Fixtures/config/xml/orm_single_em_default_table_options.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+ utf8mb4
+ utf8mb4_unicode_ci
+ InnoDB
+
+
+
+
+
+
+
+
+
+
diff --git a/Tests/DependencyInjection/Fixtures/config/yml/orm_single_em_default_table_options.yml b/Tests/DependencyInjection/Fixtures/config/yml/orm_single_em_default_table_options.yml
new file mode 100644
index 000000000..93625f1c5
--- /dev/null
+++ b/Tests/DependencyInjection/Fixtures/config/yml/orm_single_em_default_table_options.yml
@@ -0,0 +1,22 @@
+doctrine:
+ dbal:
+ default_connection: default
+ connections:
+ default:
+ dbname: db
+ default_table_options:
+ charset: utf8mb4
+ collate: utf8mb4_unicode_ci
+ engine: InnoDB
+
+ orm:
+ mappings:
+ AnnotationsBundle: ~
+ YamlBundle:
+ dir: Resources/config/doctrine
+ alias: yml
+ manual:
+ type: xml
+ prefix: Fixtures\Bundles\XmlBundle
+ dir: %kernel.root_dir%/Tests/DependencyInjection/Fixtures/Bundles/XmlBundle/Resources/config/doctrine
+ alias: TestAlias