diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 0a782f3..efc092c 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -169,6 +169,18 @@ class Configuration implements ConfigurationInterface ->scalarNode('password')->defaultValue('')->end() ->scalarNode('dsn')->defaultValue('')->end() ->scalarNode('classname')->defaultValue($this->debug ? 'DebugPDO' : 'PropelPDO')->end() + ->arrayNode('slaves') + ->useAttributeAsKey('name') + ->prototype('array') + ->children() + ->scalarNode('driver')->defaultValue('mysql')->end() + ->scalarNode('user')->defaultValue('root')->end() + ->scalarNode('password')->defaultValue('')->end() + ->scalarNode('dsn')->defaultValue('')->end() + ->scalarNode('classname')->defaultValue($this->debug ? 'DebugPDO' : 'PropelPDO')->end() + ->end() + ->end() + ->end() ->end() ->fixXmlConfig('option') ->children() diff --git a/DependencyInjection/PropelExtension.php b/DependencyInjection/PropelExtension.php index eff62ea..f00f89b 100644 --- a/DependencyInjection/PropelExtension.php +++ b/DependencyInjection/PropelExtension.php @@ -104,6 +104,9 @@ class PropelExtension extends Extension $c = array(); foreach ($config['connections'] as $name => $conf) { $c['datasources'][$name]['adapter'] = $conf['driver']; + if (!empty($conf['slaves'])) { + $c['datasources'][$name]['slaves']['connection'] = $conf['slaves']; + } foreach (array('dsn', 'user', 'password', 'classname', 'options', 'attributes', 'settings') as $att) { if (isset($conf[$att])) { diff --git a/Resources/doc/README.markdown b/Resources/doc/README.markdown index 2328813..da93f24 100644 --- a/Resources/doc/README.markdown +++ b/Resources/doc/README.markdown @@ -90,11 +90,17 @@ propel: attributes: {} # default_connection: default # connections: -# default: -# driver: mysql -# user: root -# password: null -# dsn: mysql:host=localhost;dbname=test +# default: +# driver: mysql +# user: root +# password: null +# dsn: mysql:host=localhost;dbname=test +# slaves: +# slave_server_1: +# user: root +# password: null +# dsn: mysql:host=localhost;dbname=test_slave_1 +# # options: # ATTR_PERSISTENT: false # attributes: diff --git a/Tests/DependencyInjection/PropelExtensionTest.php b/Tests/DependencyInjection/PropelExtensionTest.php index 7b920b3..6010177 100644 --- a/Tests/DependencyInjection/PropelExtensionTest.php +++ b/Tests/DependencyInjection/PropelExtensionTest.php @@ -271,4 +271,85 @@ class PropelExtensionTest extends TestCase $this->assertEquals('SET NAMES UTF8', $config['datasources']['default']['connection']['settings']['queries']['query']); } + public function testDbalWithSlaves() + { + $container = $this->getContainer(); + $loader = new PropelExtension(); + + $config_base = array( + 'path' => '/propel', + 'phing_path' => '/phing', + ); + + $config_mysql = array( + 'user' => 'mysql_usr', + 'password' => 'mysql_pwd', + 'dsn' => 'mysql_dsn', + 'driver' => 'mysql', + 'slaves' => array( + 'mysql_slave1' => array( + 'user' => 'mysql_usrs1', + 'password' => 'mysql_pwds1', + 'dsn' => 'mysql_dsns1', + ), + 'mysql_slave2' => array( + 'user' => 'mysql_usrs2', + 'password' => 'mysql_pwds2', + 'dsn' => 'mysql_dsns2', + ), + ), + ); + + $configs = array($config_base, array('dbal' => $config_mysql)); + $loader->load($configs, $container); + + $arguments = $container->getDefinition('propel.configuration')->getArguments(); + $config = $arguments[0]; + + $this->assertArrayHasKey('slaves', $config['datasources']['default']); + $this->assertArrayHasKey('connection', $config['datasources']['default']['slaves']); + $this->assertArrayHasKey('mysql_slave1', $config['datasources']['default']['slaves']['connection']); + $this->assertArrayHasKey('user', $config['datasources']['default']['slaves']['connection']['mysql_slave1']); + $this->assertArrayHasKey('password', $config['datasources']['default']['slaves']['connection']['mysql_slave1']); + $this->assertArrayHasKey('dsn', $config['datasources']['default']['slaves']['connection']['mysql_slave1']); + $this->assertArrayHasKey('mysql_slave2', $config['datasources']['default']['slaves']['connection']); + $this->assertArrayHasKey('user', $config['datasources']['default']['slaves']['connection']['mysql_slave2']); + $this->assertArrayHasKey('password', $config['datasources']['default']['slaves']['connection']['mysql_slave2']); + $this->assertArrayHasKey('dsn', $config['datasources']['default']['slaves']['connection']['mysql_slave2']); + + $this->assertEquals("mysql_usrs1", $config['datasources']['default']['slaves']['connection']['mysql_slave1']['user']); + $this->assertEquals("mysql_pwds1", $config['datasources']['default']['slaves']['connection']['mysql_slave1']['password']); + $this->assertEquals("mysql_dsns1", $config['datasources']['default']['slaves']['connection']['mysql_slave1']['dsn']); + + $this->assertEquals("mysql_usrs2", $config['datasources']['default']['slaves']['connection']['mysql_slave2']['user']); + $this->assertEquals("mysql_pwds2", $config['datasources']['default']['slaves']['connection']['mysql_slave2']['password']); + $this->assertEquals("mysql_dsns2", $config['datasources']['default']['slaves']['connection']['mysql_slave2']['dsn']); + } + + public function testDbalWithNoSlaves() + { + $container = $this->getContainer(); + $loader = new PropelExtension(); + + $config_base = array( + 'path' => '/propel', + 'phing_path' => '/phing', + ); + + $config_mysql = array( + 'user' => 'mysql_usr', + 'password' => 'mysql_pwd', + 'dsn' => 'mysql_dsn', + 'driver' => 'mysql' + ); + + $configs = array($config_base, array('dbal' => $config_mysql)); + $loader->load($configs, $container); + + $arguments = $container->getDefinition('propel.configuration')->getArguments(); + $config = $arguments[0]; + + $this->assertArrayNotHasKey('slaves', $config['datasources']['default']); + } + }