PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/htdocs/symfony/2.0.0pr3/src/vendor/symfony/src/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php

http://github.com/pmjones/php-framework-benchmarks
PHP | 384 lines | 242 code | 34 blank | 108 comment | 26 complexity | b6bc117d930ab86f18dcb5446afd5227 MD5 | raw file
Possible License(s): LGPL-3.0, Apache-2.0, BSD-3-Clause, ISC, AGPL-3.0, LGPL-2.1
  1. <?php
  2. namespace Symfony\Bundle\DoctrineMongoDBBundle\DependencyInjection;
  3. use Symfony\Component\DependencyInjection\Extension\Extension;
  4. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  5. use Symfony\Component\DependencyInjection\ContainerBuilder;
  6. use Symfony\Component\DependencyInjection\Reference;
  7. use Symfony\Component\DependencyInjection\Definition;
  8. use Symfony\Component\DependencyInjection\Resource\FileResource;
  9. /**
  10. * Doctrine MongoDB ODM extension.
  11. *
  12. * @author Bulat Shakirzyanov <bulat@theopenskyproject.com>
  13. * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
  14. * @author Jonathan H. Wage <jonwage@gmail.com>
  15. */
  16. class DoctrineMongoDBExtension extends Extension
  17. {
  18. protected $resources = array(
  19. 'mongodb' => 'mongodb.xml',
  20. );
  21. /**
  22. * Loads the MongoDB ODM configuration.
  23. *
  24. * Usage example:
  25. *
  26. * <doctrine:mongodb server="mongodb://localhost:27017" />
  27. *
  28. * @param array $config An array of configuration settings
  29. * @param ContainerBuilder $container A ContainerBuilder instance
  30. */
  31. public function mongodbLoad($config, ContainerBuilder $container)
  32. {
  33. $this->createProxyDirectory($container->getParameter('kernel.cache_dir'));
  34. $this->loadDefaults($config, $container);
  35. $this->loadConnections($config, $container);
  36. $this->loadDocumentManagers($config, $container);
  37. }
  38. /**
  39. * Create the Doctrine MongoDB ODM Document proxy directory
  40. */
  41. protected function createProxyDirectory($tmpDir)
  42. {
  43. // Create document proxy directory
  44. $proxyCacheDir = $tmpDir.'/doctrine/odm/mongodb/Proxies';
  45. if (!is_dir($proxyCacheDir)) {
  46. if (false === @mkdir($proxyCacheDir, 0777, true)) {
  47. die(sprintf('Unable to create the Doctrine Proxy directory (%s)', dirname($proxyCacheDir)));
  48. }
  49. } elseif (!is_writable($proxyCacheDir)) {
  50. die(sprintf('Unable to write in the Doctrine Proxy directory (%s)', $proxyCacheDir));
  51. }
  52. }
  53. /**
  54. * Loads the default configuration.
  55. *
  56. * @param array $config An array of configuration settings
  57. * @param ContainerBuilder $container A ContainerBuilder instance
  58. */
  59. protected function loadDefaults(array $config, ContainerBuilder $container)
  60. {
  61. if (!$container->hasDefinition('doctrine.odm.mongodb.metadata.annotation')) {
  62. // Load DoctrineMongoDBBundle/Resources/config/mongodb.xml
  63. $loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
  64. $loader->load($this->resources['mongodb']);
  65. }
  66. // Allow these application configuration options to override the defaults
  67. $options = array(
  68. 'default_document_manager',
  69. 'default_connection',
  70. 'cache_driver',
  71. 'metadata_cache_driver',
  72. 'proxy_namespace',
  73. 'auto_generate_proxy_classes',
  74. 'default_database',
  75. );
  76. foreach ($options as $key) {
  77. if (isset($config[$key])) {
  78. $container->setParameter('doctrine.odm.mongodb.'.$key, $config[$key]);
  79. }
  80. }
  81. $container->setParameter('doctrine.odm.mongodb.mapping_dirs', $this->findBundleSubpaths('Resources/config/doctrine/metadata/mongodb', $container));
  82. $container->setParameter('doctrine.odm.mongodb.document_dirs', $this->findBundleSubpaths('Document', $container));
  83. }
  84. /**
  85. * Loads the document managers configuration.
  86. *
  87. * @param array $config An array of configuration settings
  88. * @param ContainerBuilder $container A ContainerBuilder instance
  89. */
  90. protected function loadDocumentManagers(array $config, ContainerBuilder $container)
  91. {
  92. $documentManagers = $this->getDocumentManagers($config, $container);
  93. foreach ($documentManagers as $name => $documentManager) {
  94. $documentManager['name'] = $name;
  95. $this->loadDocumentManager($documentManager, $container);
  96. }
  97. }
  98. /**
  99. * Loads a document manager configuration.
  100. *
  101. * @param array $documentManager A document manager configuration array
  102. * @param ContainerBuilder $container A ContainerBuilder instance
  103. */
  104. protected function loadDocumentManager(array $documentManager, ContainerBuilder $container)
  105. {
  106. $defaultDocumentManager = $container->getParameter('doctrine.odm.mongodb.default_document_manager');
  107. $defaultDatabase = isset($documentManager['default_database']) ? $documentManager['default_database'] : $container->getParameter('doctrine.odm.mongodb.default_database');
  108. $proxyCacheDir = $container->getParameter('kernel.cache_dir').'/doctrine/odm/mongodb/Proxies';
  109. $odmConfigDef = new Definition('%doctrine.odm.mongodb.configuration_class%');
  110. $container->setDefinition(sprintf('doctrine.odm.mongodb.%s_configuration', $documentManager['name']), $odmConfigDef);
  111. $this->loadDocumentManagerBundlesMappingInformation($documentManager, $odmConfigDef, $container);
  112. $this->loadDocumentManagerMetadataCacheDriver($documentManager, $container);
  113. $methods = array(
  114. 'setMetadataCacheImpl' => new Reference(sprintf('doctrine.odm.mongodb.%s_metadata_cache', $documentManager['name'])),
  115. 'setMetadataDriverImpl' => new Reference('doctrine.odm.mongodb.metadata'),
  116. 'setProxyDir' => $proxyCacheDir,
  117. 'setProxyNamespace' => $container->getParameter('doctrine.odm.mongodb.proxy_namespace'),
  118. 'setAutoGenerateProxyClasses' => $container->getParameter('doctrine.odm.mongodb.auto_generate_proxy_classes'),
  119. 'setDefaultDB' => $defaultDatabase,
  120. 'setLoggerCallable' => array(new Reference('doctrine.odm.mongodb.logger'), 'logQuery'),
  121. );
  122. foreach ($methods as $method => $arg) {
  123. $odmConfigDef->addMethodCall($method, array($arg));
  124. }
  125. $odmDmArgs = array(
  126. new Reference(sprintf('doctrine.odm.mongodb.%s_connection', isset($documentManager['connection']) ? $documentManager['connection'] : $documentManager['name'])),
  127. new Reference(sprintf('doctrine.odm.mongodb.%s_configuration', $documentManager['name']))
  128. );
  129. $odmDmDef = new Definition('%doctrine.odm.mongodb.document_manager_class%', $odmDmArgs);
  130. $odmDmDef->setFactoryMethod('create');
  131. $container->setDefinition(sprintf('doctrine.odm.mongodb.%s_document_manager', $documentManager['name']), $odmDmDef );
  132. if ($documentManager['name'] == $defaultDocumentManager) {
  133. $container->setAlias(
  134. 'doctrine.odm.mongodb.document_manager',
  135. sprintf('doctrine.odm.mongodb.%s_document_manager', $documentManager['name'])
  136. );
  137. }
  138. }
  139. /**
  140. * Gets the configured document managers.
  141. *
  142. * @param array $config An array of configuration settings
  143. * @param ContainerBuilder $container A ContainerBuilder instance
  144. */
  145. protected function getDocumentManagers(array $config, ContainerBuilder $container)
  146. {
  147. $defaultDocumentManager = $container->getParameter('doctrine.odm.mongodb.default_document_manager');
  148. $documentManagers = array();
  149. if (isset($config['document_managers'])) {
  150. $configDocumentManagers = $config['document_managers'];
  151. if (isset($config['document_managers']['document_manager']) && isset($config['document_managers']['document_manager'][0])) {
  152. // Multiple document managers
  153. $configDocumentManagers = $config['document_managers']['document_manager'];
  154. }
  155. foreach ($configDocumentManagers as $name => $documentManager) {
  156. $documentManagers[isset($documentManager['id']) ? $documentManager['id'] : $name] = $documentManager;
  157. }
  158. } else {
  159. $documentManagers = array($defaultDocumentManager => $config);
  160. }
  161. return $documentManagers;
  162. }
  163. /**
  164. * Loads a document managers bundles mapping information configuration.
  165. *
  166. * @param array $config An array of configuration settings
  167. * @param ContainerBuilder $container A ContainerBuilder instance
  168. */
  169. protected function loadDocumentManagerBundlesMappingInformation(array $documentManager, Definition $odmConfigDef, ContainerBuilder $container)
  170. {
  171. // configure metadata driver for each bundle based on the type of mapping files found
  172. $mappingDriverDef = new Definition('%doctrine.odm.mongodb.metadata.driver_chain_class%');
  173. $bundleDocumentMappings = array();
  174. $bundleDirs = $container->getParameter('kernel.bundle_dirs');
  175. $aliasMap = array();
  176. foreach ($container->getParameter('kernel.bundles') as $className) {
  177. $tmp = dirname(str_replace('\\', '/', $className));
  178. $namespace = str_replace('/', '\\', dirname($tmp));
  179. $class = basename($tmp);
  180. if (!isset($bundleDirs[$namespace])) {
  181. continue;
  182. }
  183. $type = $this->detectMetadataDriver($bundleDirs[$namespace].'/'.$class, $container);
  184. if (is_dir($dir = $bundleDirs[$namespace].'/'.$class.'/Document')) {
  185. if ($type === null) {
  186. $type = 'annotation';
  187. }
  188. $aliasMap[$class] = $namespace.'\\'.$class.'\\Document';
  189. }
  190. if ($type !== null) {
  191. $mappingDriverDef->addMethodCall('addDriver', array(
  192. new Reference(sprintf('doctrine.odm.mongodb.metadata.%s', $type)),
  193. $namespace.'\\'.$class.'\\Document'
  194. )
  195. );
  196. }
  197. }
  198. $odmConfigDef->addMethodCall('setDocumentNamespaces', array($aliasMap));
  199. $container->setDefinition('doctrine.odm.mongodb.metadata', $mappingDriverDef);
  200. }
  201. /**
  202. * Loads the configured document manager metadata cache driver.
  203. *
  204. * @param array $config A configured document manager array
  205. * @param ContainerBuilder $container A ContainerBuilder instance
  206. */
  207. protected function loadDocumentManagerMetadataCacheDriver(array $documentManager, ContainerBuilder $container)
  208. {
  209. $metadataCacheDriver = $container->getParameter('doctrine.odm.mongodb.metadata_cache_driver');
  210. $dmMetadataCacheDriver = isset($documentManager['metadata_cache_driver']) ? $documentManager['metadata_cache_driver'] : $metadataCacheDriver;
  211. $type = is_array($dmMetadataCacheDriver) && isset($dmMetadataCacheDriver['type']) ? $dmMetadataCacheDriver['type'] : $dmMetadataCacheDriver;
  212. if ($type === 'memcache') {
  213. $memcacheClass = isset($dmMetadataCacheDriver['class']) ? $dmMetadataCacheDriver['class'] : sprintf('%%doctrine.odm.mongodb.cache.%s_class%%', $type);
  214. $cacheDef = new Definition($memcacheClass);
  215. $memcacheHost = isset($dmMetadataCacheDriver['host']) ? $dmMetadataCacheDriver['host'] : '%doctrine.odm.mongodb.cache.memcache_host%';
  216. $memcachePort = isset($dmMetadataCacheDriver['port']) ? $dmMetadataCacheDriver['port'] : '%doctrine.odm.mongodb.cache.memcache_port%';
  217. $memcacheInstanceClass = isset($dmMetadataCacheDriver['instance_class']) ? $dmMetadataCacheDriver['instance_class'] : '%doctrine.odm.mongodb.cache.memcache_instance_class%';
  218. $memcacheInstance = new Definition($memcacheInstanceClass);
  219. $memcacheInstance->addMethodCall('connect', array($memcacheHost, $memcachePort));
  220. $container->setDefinition(sprintf('doctrine.odm.mongodb.%s_memcache_instance', $documentManager['name']), $memcacheInstance);
  221. $cacheDef->addMethodCall('setMemcache', array(new Reference(sprintf('doctrine.odm.mongodb.%s_memcache_instance', $documentManager['name']))));
  222. } else {
  223. $cacheDef = new Definition(sprintf('%%doctrine.odm.mongodb.cache.%s_class%%', $type));
  224. }
  225. $container->setDefinition(sprintf('doctrine.odm.mongodb.%s_metadata_cache', $documentManager['name']), $cacheDef);
  226. }
  227. /**
  228. * Loads the configured connections.
  229. *
  230. * @param array $config An array of configuration settings
  231. * @param ContainerBuilder $container A ContainerBuilder instance
  232. */
  233. protected function loadConnections(array $config, ContainerBuilder $container)
  234. {
  235. $connections = $this->getConnections($config, $container);
  236. foreach ($connections as $name => $connection) {
  237. $odmConnArgs = array(
  238. isset($connection['server']) ? $connection['server'] : null,
  239. isset($connection['options']) ? $connection['options'] : array()
  240. );
  241. $odmConnDef = new Definition('%doctrine.odm.mongodb.connection_class%', $odmConnArgs);
  242. $container->setDefinition(sprintf('doctrine.odm.mongodb.%s_connection', $name), $odmConnDef);
  243. }
  244. }
  245. /**
  246. * Gets the configured connections.
  247. *
  248. * @param array $config An array of configuration settings
  249. * @param ContainerBuilder $container A ContainerBuilder instance
  250. */
  251. protected function getConnections(array $config, ContainerBuilder $container)
  252. {
  253. $defaultConnection = $container->getParameter('doctrine.odm.mongodb.default_connection');
  254. $connections = array();
  255. if (isset($config['connections'])) {
  256. $configConnections = $config['connections'];
  257. if (isset($config['connections']['connection']) && isset($config['connections']['connection'][0])) {
  258. // Multiple connections
  259. $configConnections = $config['connections']['connection'];
  260. }
  261. foreach ($configConnections as $name => $connection) {
  262. $connections[isset($connection['id']) ? $connection['id'] : $name] = $connection;
  263. }
  264. } else {
  265. $connections = array($defaultConnection => $config);
  266. }
  267. return $connections;
  268. }
  269. /**
  270. * Finds existing bundle subpaths.
  271. *
  272. * @param string $path A subpath to check for
  273. * @param ContainerBuilder $container A ContainerBuilder configuration
  274. *
  275. * @return array An array of absolute directory paths
  276. */
  277. protected function findBundleSubpaths($path, ContainerBuilder $container)
  278. {
  279. $dirs = array();
  280. foreach ($container->getParameter('kernel.bundles') as $bundle) {
  281. $reflection = new \ReflectionClass($bundle);
  282. if (is_dir($dir = dirname($reflection->getFilename()).'/'.$path)) {
  283. $dirs[] = $dir;
  284. $container->addResource(new FileResource($dir));
  285. } else {
  286. // add the closest existing parent directory as a file resource
  287. do {
  288. $dir = dirname($dir);
  289. } while (!is_dir($dir));
  290. $container->addResource(new FileResource($dir));
  291. }
  292. }
  293. return $dirs;
  294. }
  295. /**
  296. * Detects what metadata driver to use for the supplied directory.
  297. *
  298. * @param string $dir A directory path
  299. * @param ContainerBuilder $container A ContainerBuilder configuration
  300. *
  301. * @return string|null A metadata driver short name, if one can be detected
  302. */
  303. static protected function detectMetadataDriver($dir, ContainerBuilder $container)
  304. {
  305. // add the closest existing directory as a resource
  306. $resource = $dir.'/Resources/config/doctrine/metadata/mongodb';
  307. while (!is_dir($resource)) {
  308. $resource = dirname($resource);
  309. }
  310. $container->addResource(new FileResource($resource));
  311. if (count(glob($dir.'/Resources/config/doctrine/metadata/mongodb/*.xml'))) {
  312. return 'xml';
  313. } elseif (count(glob($dir.'/Resources/config/doctrine/metadata/mongodb/*.yml'))) {
  314. return 'yml';
  315. }
  316. // add the directory itself as a resource
  317. $container->addResource(new FileResource($dir));
  318. if (is_dir($dir.'/Document')) {
  319. return 'annotation';
  320. }
  321. }
  322. /**
  323. * Returns the namespace to be used for this extension (XML namespace).
  324. *
  325. * @return string The XML namespace
  326. */
  327. public function getNamespace()
  328. {
  329. return 'http://www.symfony-project.org/schema/dic/doctrine/odm/mongodb';
  330. }
  331. /**
  332. * @return string
  333. */
  334. public function getXsdValidationBasePath()
  335. {
  336. return __DIR__.'/../Resources/config/schema';
  337. }
  338. /**
  339. * Returns the recommended alias to use in XML.
  340. *
  341. * This alias is also the mandatory prefix to use when using YAML.
  342. *
  343. * @return string The alias
  344. */
  345. public function getAlias()
  346. {
  347. return 'doctrine_odm';
  348. }
  349. }