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