AbstractDoctrineExtensionTest.php 33 KB

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