AbstractDoctrineExtensionTest.php 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection;
  11. use Symfony\Bundle\DoctrineBundle\Tests\TestCase;
  12. use Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
  13. use Symfony\Component\DependencyInjection\ContainerBuilder;
  14. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
  15. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  16. use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
  17. use Symfony\Component\DependencyInjection\Reference;
  18. use Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass;
  19. use Symfony\Component\Config\FileLocator;
  20. abstract class AbstractDoctrineExtensionTest extends TestCase
  21. {
  22. abstract protected function loadFromFile(ContainerBuilder $container, $file);
  23. public function testDbalOverrideDefaultConnection()
  24. {
  25. $container = $this->getContainer();
  26. $loader = new DoctrineExtension();
  27. $loader->load(array(array(), array('dbal' => array('default_connection' => 'foo')), array()), $container);
  28. // doctrine.dbal.default_connection
  29. $this->assertEquals('foo', $container->getDefinition('doctrine')->getArgument(3), '->load() overrides existing configuration options');
  30. }
  31. public function testDbalLoad()
  32. {
  33. $container = $this->getContainer();
  34. $loader = new DoctrineExtension();
  35. $loader->load(array(array('dbal' => array('connections' => array('default' => array('password' => 'foo')))), array(), array('dbal' => array('default_connection' => 'foo')), array()), $container);
  36. $config = $container->getDefinition('doctrine.dbal.default_connection')->getArgument(0);
  37. $this->assertEquals('foo', $config['password']);
  38. $this->assertEquals('root', $config['user']);
  39. }
  40. public function testDbalLoadFromXmlMultipleConnections()
  41. {
  42. $container = $this->getContainer();
  43. $loader = new DoctrineExtension();
  44. $container->registerExtension($loader);
  45. $loadXml = new XmlFileLoader($container, new FileLocator(__DIR__.'/Fixtures/config/xml'));
  46. $loadXml->load('dbal_service_multiple_connections.xml');
  47. $loader->load(array(array()), $container);
  48. $this->compileContainer($container);
  49. // doctrine.dbal.mysql_connection
  50. $config = $container->getDefinition('doctrine.dbal.mysql_connection')->getArgument(0);
  51. $this->assertEquals('mysql_s3cr3t', $config['password']);
  52. $this->assertEquals('mysql_user', $config['user']);
  53. $this->assertEquals('mysql_db', $config['dbname']);
  54. $this->assertEquals('/path/to/mysqld.sock', $config['unix_socket']);
  55. // doctrine.dbal.sqlite_connection
  56. $config = $container->getDefinition('doctrine.dbal.sqlite_connection')->getArgument(0);
  57. $this->assertArrayHasKey('memory', $config);
  58. // doctrine.dbal.oci8_connection
  59. $config = $container->getDefinition('doctrine.dbal.oci_connection')->getArgument(0);
  60. $this->assertArrayHasKey('charset', $config);
  61. }
  62. public function testDbalLoadFromXmlSingleConnections()
  63. {
  64. $container = $this->getContainer();
  65. $loader = new DoctrineExtension();
  66. $container->registerExtension($loader);
  67. $loadXml = new XmlFileLoader($container, new FileLocator(__DIR__.'/Fixtures/config/xml'));
  68. $loadXml->load('dbal_service_single_connection.xml');
  69. $loader->load(array(array()), $container);
  70. $this->compileContainer($container);
  71. // doctrine.dbal.mysql_connection
  72. $config = $container->getDefinition('doctrine.dbal.default_connection')->getArgument(0);
  73. $this->assertEquals('mysql_s3cr3t', $config['password']);
  74. $this->assertEquals('mysql_user', $config['user']);
  75. $this->assertEquals('mysql_db', $config['dbname']);
  76. $this->assertEquals('/path/to/mysqld.sock', $config['unix_socket']);
  77. }
  78. public function testDependencyInjectionConfigurationDefaults()
  79. {
  80. $container = $this->getContainer();
  81. $loader = new DoctrineExtension();
  82. $loader->load(array(array('dbal' => array('connections' => array('default' => array('password' => 'foo'))), 'orm' => array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('YamlBundle' => array())))))), $container);
  83. $this->assertFalse($container->getParameter('doctrine.orm.auto_generate_proxy_classes'));
  84. $this->assertEquals('Doctrine\ORM\Configuration', $container->getParameter('doctrine.orm.configuration.class'));
  85. $this->assertEquals('Doctrine\ORM\EntityManager', $container->getParameter('doctrine.orm.entity_manager.class'));
  86. $this->assertEquals('Proxies', $container->getParameter('doctrine.orm.proxy_namespace'));
  87. $this->assertEquals('Doctrine\Common\Cache\ArrayCache', $container->getParameter('doctrine.orm.cache.array.class'));
  88. $this->assertEquals('Doctrine\Common\Cache\ApcCache', $container->getParameter('doctrine.orm.cache.apc.class'));
  89. $this->assertEquals('Doctrine\Common\Cache\MemcacheCache', $container->getParameter('doctrine.orm.cache.memcache.class'));
  90. $this->assertEquals('localhost', $container->getParameter('doctrine.orm.cache.memcache_host'));
  91. $this->assertEquals('11211', $container->getParameter('doctrine.orm.cache.memcache_port'));
  92. $this->assertEquals('Memcache', $container->getParameter('doctrine.orm.cache.memcache_instance.class'));
  93. $this->assertEquals('Doctrine\Common\Cache\XcacheCache', $container->getParameter('doctrine.orm.cache.xcache.class'));
  94. $this->assertEquals('Doctrine\ORM\Mapping\Driver\DriverChain', $container->getParameter('doctrine.orm.metadata.driver_chain.class'));
  95. $this->assertEquals('Doctrine\ORM\Mapping\Driver\AnnotationDriver', $container->getParameter('doctrine.orm.metadata.annotation.class'));
  96. $this->assertEquals('Doctrine\Common\Annotations\AnnotationReader', $container->getParameter('doctrine.orm.metadata.annotation_reader.class'));
  97. $this->assertEquals('Symfony\Bundle\DoctrineBundle\Mapping\Driver\XmlDriver', $container->getParameter('doctrine.orm.metadata.xml.class'));
  98. $this->assertEquals('Symfony\Bundle\DoctrineBundle\Mapping\Driver\YamlDriver', $container->getParameter('doctrine.orm.metadata.yml.class'));
  99. $config = array(
  100. 'proxy_namespace' => 'MyProxies',
  101. 'auto_generate_proxy_classes' => true,
  102. 'default_entity_manager' => 'default',
  103. 'entity_managers' => array(
  104. 'default' => array(
  105. 'mappings' => array('YamlBundle' => array()),
  106. )
  107. )
  108. );
  109. $container = $this->getContainer();
  110. $loader->load(array(array('dbal' => array('connections' => array('default' => array('password' => 'foo'))), 'orm' => $config)), $container);
  111. $this->compileContainer($container);
  112. $definition = $container->getDefinition('doctrine.dbal.default_connection');
  113. $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
  114. $args = $definition->getArguments();
  115. $this->assertEquals('pdo_mysql', $args[0]['driver']);
  116. $this->assertEquals('localhost', $args[0]['host']);
  117. $this->assertEquals('root', $args[0]['user']);
  118. $this->assertEquals('doctrine.dbal.default_connection.configuration', (string) $args[1]);
  119. $this->assertEquals('doctrine.dbal.default_connection.event_manager', (string) $args[2]);
  120. $definition = $container->getDefinition('doctrine.orm.default_entity_manager');
  121. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
  122. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
  123. $this->assertEquals('create', $definition->getFactoryMethod());
  124. $this->assertEquals(array('default' => 'doctrine.orm.default_entity_manager'), $container->getDefinition('doctrine')->getArgument(2), "Set of the existing EntityManagers names is incorrect.");
  125. $arguments = $definition->getArguments();
  126. $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[0]);
  127. $this->assertEquals('doctrine.dbal.default_connection', (string) $arguments[0]);
  128. $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[1]);
  129. $this->assertEquals('doctrine.orm.default_configuration', (string) $arguments[1]);
  130. $definition = $container->getDefinition('doctrine.orm.default_configuration');
  131. $calls = array_values($definition->getMethodCalls());
  132. $this->assertEquals(array('YamlBundle' => 'Fixtures\Bundles\YamlBundle\Entity'), $calls[0][1][0]);
  133. $this->assertEquals('doctrine.orm.default_metadata_cache', (string) $calls[1][1][0]);
  134. $this->assertEquals('doctrine.orm.default_query_cache', (string) $calls[2][1][0]);
  135. $this->assertEquals('doctrine.orm.default_result_cache', (string) $calls[3][1][0]);
  136. $definition = $container->getDefinition('doctrine.orm.default_metadata_cache');
  137. $this->assertEquals('%doctrine.orm.cache.array.class%', $definition->getClass());
  138. $definition = $container->getDefinition('doctrine.orm.default_query_cache');
  139. $this->assertEquals('%doctrine.orm.cache.array.class%', $definition->getClass());
  140. $definition = $container->getDefinition('doctrine.orm.default_result_cache');
  141. $this->assertEquals('%doctrine.orm.cache.array.class%', $definition->getClass());
  142. }
  143. public function testSingleEntityManagerConfiguration()
  144. {
  145. $container = $this->getContainer();
  146. $loader = new DoctrineExtension();
  147. $loader->load(array(array('dbal' => array('connections' => array('default' => array('password' => 'foo'))), 'orm' => array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('YamlBundle' => array())))))), $container);
  148. $this->compileContainer($container);
  149. $definition = $container->getDefinition('doctrine.dbal.default_connection');
  150. $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
  151. $definition = $container->getDefinition('doctrine.orm.default_entity_manager');
  152. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
  153. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
  154. $this->assertEquals('create', $definition->getFactoryMethod());
  155. $this->assertDICConstructorArguments($definition, array(
  156. new Reference('doctrine.dbal.default_connection'), new Reference('doctrine.orm.default_configuration')
  157. ));
  158. }
  159. public function testLoadSimpleSingleConnection()
  160. {
  161. $container = $this->getContainer();
  162. $loader = new DoctrineExtension();
  163. $container->registerExtension($loader);
  164. $this->loadFromFile($container, 'orm_service_simple_single_entity_manager');
  165. $this->compileContainer($container);
  166. $definition = $container->getDefinition('doctrine.dbal.default_connection');
  167. $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
  168. $this->assertDICConstructorArguments($definition, array(
  169. array(
  170. 'dbname' => 'db',
  171. 'host' => 'localhost',
  172. 'port' => null,
  173. 'user' => 'root',
  174. 'password' => null,
  175. 'driver' => 'pdo_mysql',
  176. 'logging' => false,
  177. 'driverOptions' => array(),
  178. ),
  179. new Reference('doctrine.dbal.default_connection.configuration'),
  180. new Reference('doctrine.dbal.default_connection.event_manager')
  181. ));
  182. $definition = $container->getDefinition('doctrine.orm.default_entity_manager');
  183. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
  184. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
  185. $this->assertEquals('create', $definition->getFactoryMethod());
  186. $this->assertDICConstructorArguments($definition, array(
  187. new Reference('doctrine.dbal.default_connection'), new Reference('doctrine.orm.default_configuration')
  188. ));
  189. }
  190. public function testLoadSingleConnection()
  191. {
  192. $container = $this->getContainer();
  193. $loader = new DoctrineExtension();
  194. $container->registerExtension($loader);
  195. $this->loadFromFile($container, 'orm_service_single_entity_manager');
  196. $this->compileContainer($container);
  197. $definition = $container->getDefinition('doctrine.dbal.default_connection');
  198. $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
  199. $this->assertDICConstructorArguments($definition, array(
  200. array(
  201. 'host' => 'localhost',
  202. 'driver' => 'pdo_sqlite',
  203. 'driverOptions' => array(),
  204. 'user' => 'sqlite_user',
  205. 'port' => null,
  206. 'password' => 'sqlite_s3cr3t',
  207. 'dbname' => 'sqlite_db',
  208. 'memory' => true,
  209. 'logging' => false,
  210. ),
  211. new Reference('doctrine.dbal.default_connection.configuration'),
  212. new Reference('doctrine.dbal.default_connection.event_manager')
  213. ));
  214. $definition = $container->getDefinition('doctrine.orm.default_entity_manager');
  215. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
  216. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
  217. $this->assertEquals('create', $definition->getFactoryMethod());
  218. $this->assertDICConstructorArguments($definition, array(
  219. new Reference('doctrine.dbal.default_connection'), new Reference('doctrine.orm.default_configuration')
  220. ));
  221. }
  222. public function testLoadMultipleConnections()
  223. {
  224. $container = $this->getContainer();
  225. $loader = new DoctrineExtension();
  226. $container->registerExtension($loader);
  227. $this->loadFromFile($container, 'orm_service_multiple_entity_managers');
  228. $this->compileContainer($container);
  229. $definition = $container->getDefinition('doctrine.dbal.conn1_connection');
  230. $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
  231. $args = $definition->getArguments();
  232. $this->assertEquals('pdo_sqlite', $args[0]['driver']);
  233. $this->assertEquals('localhost', $args[0]['host']);
  234. $this->assertEquals('sqlite_user', $args[0]['user']);
  235. $this->assertEquals('doctrine.dbal.conn1_connection.configuration', (string) $args[1]);
  236. $this->assertEquals('doctrine.dbal.conn1_connection.event_manager', (string) $args[2]);
  237. $this->assertEquals('doctrine.orm.em2_entity_manager', (string) $container->getAlias('doctrine.orm.entity_manager'));
  238. $definition = $container->getDefinition('doctrine.orm.em1_entity_manager');
  239. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
  240. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
  241. $this->assertEquals('create', $definition->getFactoryMethod());
  242. $arguments = $definition->getArguments();
  243. $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[0]);
  244. $this->assertEquals('doctrine.dbal.conn1_connection', (string) $arguments[0]);
  245. $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[1]);
  246. $this->assertEquals('doctrine.orm.em1_configuration', (string) $arguments[1]);
  247. $definition = $container->getDefinition('doctrine.dbal.conn2_connection');
  248. $this->assertEquals('%doctrine.dbal.connection.class%', $definition->getClass());
  249. $args = $definition->getArguments();
  250. $this->assertEquals('pdo_sqlite', $args[0]['driver']);
  251. $this->assertEquals('localhost', $args[0]['host']);
  252. $this->assertEquals('sqlite_user', $args[0]['user']);
  253. $this->assertEquals('doctrine.dbal.conn2_connection.configuration', (string) $args[1]);
  254. $this->assertEquals('doctrine.dbal.conn2_connection.event_manager', (string) $args[2]);
  255. $definition = $container->getDefinition('doctrine.orm.em2_entity_manager');
  256. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getClass());
  257. $this->assertEquals('%doctrine.orm.entity_manager.class%', $definition->getFactoryClass());
  258. $this->assertEquals('create', $definition->getFactoryMethod());
  259. $arguments = $definition->getArguments();
  260. $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[0]);
  261. $this->assertEquals('doctrine.dbal.conn2_connection', (string) $arguments[0]);
  262. $this->assertInstanceOf('Symfony\Component\DependencyInjection\Reference', $arguments[1]);
  263. $this->assertEquals('doctrine.orm.em2_configuration', (string) $arguments[1]);
  264. $definition = $container->getDefinition('doctrine.orm.em1_metadata_cache');
  265. $this->assertEquals('%doctrine.orm.cache.xcache.class%', $definition->getClass());
  266. $definition = $container->getDefinition('doctrine.orm.em1_query_cache');
  267. $this->assertEquals('%doctrine.orm.cache.array.class%', $definition->getClass());
  268. $definition = $container->getDefinition('doctrine.orm.em1_result_cache');
  269. $this->assertEquals('%doctrine.orm.cache.array.class%', $definition->getClass());
  270. }
  271. public function testBundleEntityAliases()
  272. {
  273. $container = $this->getContainer();
  274. $loader = new DoctrineExtension();
  275. $config = $this->getConnectionConfig();
  276. $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('YamlBundle' => array()))));
  277. $loader->load(array($config), $container);
  278. $definition = $container->getDefinition('doctrine.orm.default_configuration');
  279. $this->assertDICDefinitionMethodCallOnce($definition, 'setEntityNamespaces',
  280. array(array('YamlBundle' => 'Fixtures\Bundles\YamlBundle\Entity'))
  281. );
  282. }
  283. public function testOverwriteEntityAliases()
  284. {
  285. $container = $this->getContainer();
  286. $loader = new DoctrineExtension();
  287. $config = $this->getConnectionConfig();
  288. $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('YamlBundle' => array('alias' => 'yml')))));
  289. $loader->load(array($config), $container);
  290. $definition = $container->getDefinition('doctrine.orm.default_configuration');
  291. $this->assertDICDefinitionMethodCallOnce($definition, 'setEntityNamespaces',
  292. array(array('yml' => 'Fixtures\Bundles\YamlBundle\Entity'))
  293. );
  294. }
  295. public function testYamlBundleMappingDetection()
  296. {
  297. $container = $this->getContainer('YamlBundle');
  298. $loader = new DoctrineExtension();
  299. $config = $this->getConnectionConfig();
  300. $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('YamlBundle' => array()))));
  301. $loader->load(array($config), $container);
  302. $definition = $container->getDefinition('doctrine.orm.default_metadata_driver');
  303. $this->assertDICDefinitionMethodCallOnce($definition, 'addDriver', array(
  304. new Reference('doctrine.orm.default_yml_metadata_driver'),
  305. 'Fixtures\Bundles\YamlBundle\Entity'
  306. ));
  307. }
  308. public function testXmlBundleMappingDetection()
  309. {
  310. $container = $this->getContainer('XmlBundle');
  311. $loader = new DoctrineExtension();
  312. $config = $this->getConnectionConfig();
  313. $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('XmlBundle' => array()))));
  314. $loader->load(array($config), $container);
  315. $definition = $container->getDefinition('doctrine.orm.default_metadata_driver');
  316. $this->assertDICDefinitionMethodCallOnce($definition, 'addDriver', array(
  317. new Reference('doctrine.orm.default_xml_metadata_driver'),
  318. 'Fixtures\Bundles\XmlBundle\Entity'
  319. ));
  320. }
  321. public function testAnnotationsBundleMappingDetection()
  322. {
  323. $container = $this->getContainer('AnnotationsBundle');
  324. $loader = new DoctrineExtension();
  325. $config = $this->getConnectionConfig();
  326. $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('AnnotationsBundle' => array()))));
  327. $loader->load(array($config), $container);
  328. $definition = $container->getDefinition('doctrine.orm.default_metadata_driver');
  329. $this->assertDICDefinitionMethodCallOnce($definition, 'addDriver', array(
  330. new Reference('doctrine.orm.default_annotation_metadata_driver'),
  331. 'Fixtures\Bundles\AnnotationsBundle\Entity'
  332. ));
  333. }
  334. public function testOrmMergeConfigs()
  335. {
  336. $container = $this->getContainer(array('XmlBundle', 'AnnotationsBundle'));
  337. $loader = new DoctrineExtension();
  338. $config1 = $this->getConnectionConfig();
  339. $config1['orm'] = array(
  340. 'auto_generate_proxy_classes' => true,
  341. 'default_entity_manager' => 'default',
  342. 'entity_managers' => array(
  343. 'default' => array('mappings' => array('AnnotationsBundle' => array()))
  344. ));
  345. $config2 = $this->getConnectionConfig();
  346. $config2['orm'] = array(
  347. 'auto_generate_proxy_classes' => false,
  348. 'default_entity_manager' => 'default',
  349. 'entity_managers' => array(
  350. 'default' => array('mappings' => array('XmlBundle' => array()))
  351. ));
  352. $loader->load(array($config1, $config2), $container);
  353. $definition = $container->getDefinition('doctrine.orm.default_metadata_driver');
  354. $this->assertDICDefinitionMethodCallAt(0, $definition, 'addDriver', array(
  355. new Reference('doctrine.orm.default_annotation_metadata_driver'),
  356. 'Fixtures\Bundles\AnnotationsBundle\Entity'
  357. ));
  358. $this->assertDICDefinitionMethodCallAt(1, $definition, 'addDriver', array(
  359. new Reference('doctrine.orm.default_xml_metadata_driver'),
  360. 'Fixtures\Bundles\XmlBundle\Entity'
  361. ));
  362. $configDef = $container->getDefinition('doctrine.orm.default_configuration');
  363. $this->assertDICDefinitionMethodCallOnce($configDef, 'setAutoGenerateProxyClasses');
  364. $calls = $configDef->getMethodCalls();
  365. foreach ($calls as $call) {
  366. if ($call[0] == 'setAutoGenerateProxyClasses') {
  367. $this->assertFalse($container->getParameterBag()->resolveValue($call[1][0]));
  368. break;
  369. }
  370. }
  371. }
  372. public function testEntityManagerMetadataCacheDriverConfiguration()
  373. {
  374. $container = $this->getContainer();
  375. $loader = new DoctrineExtension();
  376. $container->registerExtension($loader);
  377. $this->loadFromFile($container, 'orm_service_multiple_entity_managers');
  378. $this->compileContainer($container);
  379. $definition = $container->getDefinition('doctrine.orm.em1_metadata_cache');
  380. $this->assertDICDefinitionClass($definition, '%doctrine.orm.cache.xcache.class%');
  381. $definition = $container->getDefinition('doctrine.orm.em2_metadata_cache');
  382. $this->assertDICDefinitionClass($definition, '%doctrine.orm.cache.apc.class%');
  383. }
  384. public function testEntityManagerMemcacheMetadataCacheDriverConfiguration()
  385. {
  386. $container = $this->getContainer();
  387. $loader = new DoctrineExtension();
  388. $container->registerExtension($loader);
  389. $this->loadFromFile($container, 'orm_service_simple_single_entity_manager');
  390. $this->compileContainer($container);
  391. $definition = $container->getDefinition('doctrine.orm.default_metadata_cache');
  392. $this->assertDICDefinitionClass($definition, 'Doctrine\Common\Cache\MemcacheCache');
  393. $this->assertDICDefinitionMethodCallOnce($definition, 'setMemcache',
  394. array(new Reference('doctrine.orm.default_memcache_instance'))
  395. );
  396. $definition = $container->getDefinition('doctrine.orm.default_memcache_instance');
  397. $this->assertDICDefinitionClass($definition, 'Memcache');
  398. $this->assertDICDefinitionMethodCallOnce($definition, 'connect', array(
  399. 'localhost', '11211'
  400. ));
  401. }
  402. public function testDependencyInjectionImportsOverrideDefaults()
  403. {
  404. $container = $this->getContainer();
  405. $loader = new DoctrineExtension();
  406. $container->registerExtension($loader);
  407. $this->loadFromFile($container, 'orm_imports');
  408. $this->compileContainer($container);
  409. $cacheDefinition = $container->getDefinition('doctrine.orm.default_metadata_cache');
  410. $this->assertEquals('%doctrine.orm.cache.apc.class%', $cacheDefinition->getClass());
  411. $configDefinition = $container->getDefinition('doctrine.orm.default_configuration');
  412. $this->assertDICDefinitionMethodCallOnce($configDefinition, 'setAutoGenerateProxyClasses', array(true));
  413. }
  414. public function testSingleEntityManagerMultipleMappingBundleDefinitions()
  415. {
  416. $container = $this->getContainer(array('YamlBundle', 'AnnotationsBundle', 'XmlBundle'));
  417. $loader = new DoctrineExtension();
  418. $container->registerExtension($loader);
  419. $this->loadFromFile($container, 'orm_single_em_bundle_mappings');
  420. $this->compileContainer($container);
  421. $definition = $container->getDefinition('doctrine.orm.default_metadata_driver');
  422. $this->assertDICDefinitionMethodCallAt(0, $definition, 'addDriver', array(
  423. new Reference('doctrine.orm.default_annotation_metadata_driver'),
  424. 'Fixtures\Bundles\AnnotationsBundle\Entity'
  425. ));
  426. $this->assertDICDefinitionMethodCallAt(1, $definition, 'addDriver', array(
  427. new Reference('doctrine.orm.default_yml_metadata_driver'),
  428. 'Fixtures\Bundles\YamlBundle\Entity'
  429. ));
  430. $this->assertDICDefinitionMethodCallAt(2, $definition, 'addDriver', array(
  431. new Reference('doctrine.orm.default_xml_metadata_driver'),
  432. 'Fixtures\Bundles\XmlBundle'
  433. ));
  434. $annDef = $container->getDefinition('doctrine.orm.default_annotation_metadata_driver');
  435. $this->assertDICConstructorArguments($annDef, array(
  436. new Reference('doctrine.orm.metadata.annotation_reader'),
  437. array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'AnnotationsBundle'.DIRECTORY_SEPARATOR.'Entity')
  438. ));
  439. $ymlDef = $container->getDefinition('doctrine.orm.default_yml_metadata_driver');
  440. $this->assertDICConstructorArguments($ymlDef, array(
  441. array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'YamlBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config')
  442. ));
  443. $xmlDef = $container->getDefinition('doctrine.orm.default_xml_metadata_driver');
  444. $this->assertDICConstructorArguments($xmlDef, array(
  445. array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'XmlBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config')
  446. ));
  447. }
  448. public function testMultipleEntityManagersMappingBundleDefinitions()
  449. {
  450. $container = $this->getContainer(array('YamlBundle', 'AnnotationsBundle', 'XmlBundle'));
  451. $loader = new DoctrineExtension();
  452. $container->registerExtension($loader);
  453. $this->loadFromFile($container, 'orm_multiple_em_bundle_mappings');
  454. $this->compileContainer($container);
  455. $this->assertEquals(array('em1' => 'doctrine.orm.em1_entity_manager', 'em2' => 'doctrine.orm.em2_entity_manager'), $container->getDefinition('doctrine')->getArgument(2), "Set of the existing EntityManagers names is incorrect.");
  456. $def1 = $container->getDefinition('doctrine.orm.em1_metadata_driver');
  457. $def2 = $container->getDefinition('doctrine.orm.em2_metadata_driver');
  458. $this->assertDICDefinitionMethodCallAt(0, $def1, 'addDriver', array(
  459. new Reference('doctrine.orm.em1_annotation_metadata_driver'),
  460. 'Fixtures\Bundles\AnnotationsBundle\Entity'
  461. ));
  462. $this->assertDICDefinitionMethodCallAt(0, $def2, 'addDriver', array(
  463. new Reference('doctrine.orm.em2_yml_metadata_driver'),
  464. 'Fixtures\Bundles\YamlBundle\Entity'
  465. ));
  466. $this->assertDICDefinitionMethodCallAt(1, $def2, 'addDriver', array(
  467. new Reference('doctrine.orm.em2_xml_metadata_driver'),
  468. 'Fixtures\Bundles\XmlBundle'
  469. ));
  470. $annDef = $container->getDefinition('doctrine.orm.em1_annotation_metadata_driver');
  471. $this->assertDICConstructorArguments($annDef, array(
  472. new Reference('doctrine.orm.metadata.annotation_reader'),
  473. array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'AnnotationsBundle'.DIRECTORY_SEPARATOR.'Entity')
  474. ));
  475. $ymlDef = $container->getDefinition('doctrine.orm.em2_yml_metadata_driver');
  476. $this->assertDICConstructorArguments($ymlDef, array(
  477. array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'YamlBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config')
  478. ));
  479. $xmlDef = $container->getDefinition('doctrine.orm.em2_xml_metadata_driver');
  480. $this->assertDICConstructorArguments($xmlDef, array(
  481. array(__DIR__ .DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'Bundles'.DIRECTORY_SEPARATOR.'XmlBundle'.DIRECTORY_SEPARATOR.'Resources'.DIRECTORY_SEPARATOR.'config')
  482. ));
  483. }
  484. public function testAnnotationsBundleMappingDetectionWithVendorNamespace()
  485. {
  486. $container = $this->getContainer('AnnotationsBundle', 'Vendor');
  487. $loader = new DoctrineExtension();
  488. $config = $this->getConnectionConfig();
  489. $config['orm'] = array('default_entity_manager' => 'default', 'entity_managers' => array('default' => array('mappings' => array('AnnotationsBundle' => array()))));
  490. $loader->load(array($config), $container);
  491. $calls = $container->getDefinition('doctrine.orm.default_metadata_driver')->getMethodCalls();
  492. $this->assertEquals('doctrine.orm.default_annotation_metadata_driver', (string) $calls[0][1][0]);
  493. $this->assertEquals('Fixtures\Bundles\Vendor\AnnotationsBundle\Entity', $calls[0][1][1]);
  494. }
  495. public function testSetTypes()
  496. {
  497. $container = $this->getContainer(array('YamlBundle'));
  498. $loader = new DoctrineExtension();
  499. $container->registerExtension($loader);
  500. $this->loadFromFile($container, 'dbal_types');
  501. $this->compileContainer($container);
  502. $this->assertEquals(
  503. array('test' => 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestType'),
  504. $container->getDefinition('doctrine.dbal.connection_factory')->getArgument(0)
  505. );
  506. }
  507. public function testSetCustomFunctions()
  508. {
  509. $container = $this->getContainer(array('YamlBundle'));
  510. $loader = new DoctrineExtension();
  511. $container->registerExtension($loader);
  512. $this->loadFromFile($container, 'orm_functions');
  513. $this->compileContainer($container);
  514. $definition = $container->getDefinition('doctrine.orm.default_configuration');
  515. $this->assertDICDefinitionMethodCallOnce($definition, 'addCustomStringFunction', array('test_string', 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestStringFunction'));
  516. $this->assertDICDefinitionMethodCallOnce($definition, 'addCustomNumericFunction', array('test_numeric', 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestNumericFunction'));
  517. $this->assertDICDefinitionMethodCallOnce($definition, 'addCustomDatetimeFunction', array('test_datetime', 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestDatetimeFunction'));
  518. }
  519. public function testAddCustomHydrationMode()
  520. {
  521. $container = $this->getContainer(array('YamlBundle'));
  522. $loader = new DoctrineExtension();
  523. $container->registerExtension($loader);
  524. $this->loadFromFile($container, 'orm_hydration_mode');
  525. $this->compileContainer($container);
  526. $definition = $container->getDefinition('doctrine.orm.default_configuration');
  527. $this->assertDICDefinitionMethodCallOnce($definition, 'addCustomHydrationMode', array('test_hydrator', 'Symfony\Bundle\DoctrineBundle\Tests\DependencyInjection\TestHydrator'));
  528. }
  529. protected function getContainer($bundles = 'YamlBundle', $vendor = null)
  530. {
  531. $bundles = (array) $bundles;
  532. $map = array();
  533. foreach ($bundles as $bundle) {
  534. require_once __DIR__.'/Fixtures/Bundles/'.($vendor ? $vendor.'/' : '').$bundle.'/'.$bundle.'.php';
  535. $map[$bundle] = 'Fixtures\\Bundles\\'.($vendor ? $vendor.'\\' : '').$bundle.'\\'.$bundle;
  536. }
  537. return new ContainerBuilder(new ParameterBag(array(
  538. 'kernel.debug' => false,
  539. 'kernel.bundles' => $map,
  540. 'kernel.cache_dir' => sys_get_temp_dir(),
  541. 'kernel.root_dir' => __DIR__ . "/../../../../../" // src dir
  542. )));
  543. }
  544. /**
  545. * Assertion on the Class of a DIC Service Definition.
  546. *
  547. * @param \Symfony\Component\DependencyInjection\Definition $definition
  548. * @param string $expectedClass
  549. */
  550. protected function assertDICDefinitionClass($definition, $expectedClass)
  551. {
  552. $this->assertEquals($expectedClass, $definition->getClass(), "Expected Class of the DIC Container Service Definition is wrong.");
  553. }
  554. protected function assertDICConstructorArguments($definition, $args)
  555. {
  556. $this->assertEquals($args, $definition->getArguments(), "Expected and actual DIC Service constructor arguments of definition '" . $definition->getClass()."' don't match.");
  557. }
  558. protected function assertDICDefinitionMethodCallAt($pos, $definition, $methodName, array $params = null)
  559. {
  560. $calls = $definition->getMethodCalls();
  561. if (isset($calls[$pos][0])) {
  562. $this->assertEquals($methodName, $calls[$pos][0], "Method '".$methodName."' is expected to be called at position $pos.");
  563. if ($params !== null) {
  564. $this->assertEquals($params, $calls[$pos][1], "Expected parameters to methods '" . $methodName . "' do not match the actual parameters.");
  565. }
  566. }
  567. }
  568. /**
  569. * Assertion for the DI Container, check if the given definition contains a method call with the given parameters.
  570. *
  571. * @param \Symfony\Component\DependencyInjection\Definition $definition
  572. * @param string $methodName
  573. * @param array $params
  574. * @return void
  575. */
  576. protected function assertDICDefinitionMethodCallOnce($definition, $methodName, array $params = null)
  577. {
  578. $calls = $definition->getMethodCalls();
  579. $called = false;
  580. foreach ($calls as $call) {
  581. if ($call[0] == $methodName) {
  582. if ($called) {
  583. $this->fail("Method '".$methodName."' is expected to be called only once, a second call was registered though.");
  584. } else {
  585. $called = true;
  586. if ($params !== null) {
  587. $this->assertEquals($params, $call[1], "Expected parameters to methods '" . $methodName . "' do not match the actual parameters.");
  588. }
  589. }
  590. }
  591. }
  592. if (!$called) {
  593. $this->fail("Method '" . $methodName . "' is expected to be called once, definition does not contain a call though.");
  594. }
  595. }
  596. protected function compileContainer(ContainerBuilder $container)
  597. {
  598. $container->getCompilerPassConfig()->setOptimizationPasses(array(new ResolveDefinitionTemplatesPass()));
  599. $container->getCompilerPassConfig()->setRemovingPasses(array());
  600. $container->compile();
  601. }
  602. protected function getConnectionConfig()
  603. {
  604. return array('dbal' => array('connections' => array('default' => array('password' => 'foo'))));
  605. }
  606. }