vendor/doctrine/phpcr-bundle/src/DependencyInjection/DoctrinePHPCRExtension.php line 61

Open in your IDE?
  1. <?php
  2. namespace Doctrine\Bundle\PHPCRBundle\DependencyInjection;
  3. use Doctrine\Bundle\PHPCRBundle\ManagerRegistryInterface;
  4. use Doctrine\ODM\PHPCR\Document\Generic;
  5. use Doctrine\ODM\PHPCR\DocumentManagerInterface;
  6. use Jackalope\Session;
  7. use Jackalope\Tools\Console\Command\InitDoctrineDbalCommand as BaseInitDoctrineDbalCommand;
  8. use Jackalope\Tools\Console\Command\JackrabbitCommand as BaseJackrabbitCommand;
  9. use PHPCR\SessionInterface;
  10. use Symfony\Bridge\Doctrine\DependencyInjection\AbstractDoctrineExtension;
  11. use Symfony\Component\Cache\Adapter\ArrayAdapter;
  12. use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
  13. use Symfony\Component\Config\Definition\Processor;
  14. use Symfony\Component\Config\FileLocator;
  15. use Symfony\Component\DependencyInjection\Alias;
  16. use Symfony\Component\DependencyInjection\ChildDefinition;
  17. use Symfony\Component\DependencyInjection\ContainerBuilder;
  18. use Symfony\Component\DependencyInjection\Definition;
  19. use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
  20. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  21. use Symfony\Component\DependencyInjection\Reference;
  22. /**
  23. * @author Lukas Kahwe Smith <smith@pooteeweet.org>
  24. * @author Benjamin Eberlei <kontakt@beberlei.de>
  25. */
  26. final class DoctrinePHPCRExtension extends AbstractDoctrineExtension
  27. {
  28. private string $defaultSession;
  29. /**
  30. * @var string[]
  31. */
  32. private array $sessions = [];
  33. private XmlFileLoader $loader;
  34. private bool $disableProxyWarmer = false;
  35. /**
  36. * Whether the schema listener service has been loaded already.
  37. *
  38. * This is done the first time a session with jackalope-doctrine-dbal is encountered.
  39. */
  40. private bool $dbalSchemaListenerLoaded = false;
  41. public function load(array $configs, ContainerBuilder $container): void
  42. {
  43. $processor = new Processor();
  44. $configuration = new Configuration();
  45. $config = $processor->processConfiguration($configuration, $configs);
  46. $this->loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
  47. $this->loader->load('phpcr.xml');
  48. $this->loader->load('commands.xml');
  49. if (class_exists(BaseJackrabbitCommand::class)) {
  50. $this->loader->load('jackrabbit-commands.xml');
  51. }
  52. if (class_exists(BaseInitDoctrineDbalCommand::class)) {
  53. $this->loader->load('jackalope_doctrine_dbal-commands.xml');
  54. }
  55. // default values in case no odm is configured. the manager registry needs these variables to be defined.
  56. // if odm is enabled, the parameters are overwritten later in the `loadOdm` section.
  57. $container->setParameter('doctrine_phpcr.odm.document_managers', []);
  58. $container->setParameter('doctrine_phpcr.odm.default_document_manager', '');
  59. $managerRegistryServiceId = 'doctrine_phpcr';
  60. if (!empty($config['manager_registry_service_id'])) {
  61. $managerRegistryServiceId = $config['manager_registry_service_id'];
  62. $container->setAlias('doctrine_phpcr', new Alias($config['manager_registry_service_id'], true));
  63. }
  64. $container->setAlias(ManagerRegistryInterface::class, new Alias($managerRegistryServiceId, true));
  65. $parameters = [
  66. 'workspace_dir',
  67. 'jackrabbit_jar',
  68. 'dump_max_line_length',
  69. ];
  70. foreach ($parameters as $param) {
  71. $container->setParameter('doctrine_phpcr.'.$param, $config[$param]);
  72. }
  73. if (!empty($config['session'])) {
  74. $this->sessionLoad($config['session'], $container);
  75. }
  76. if (!empty($config['odm'])) {
  77. if (empty($this->sessions)) {
  78. throw new InvalidArgumentException('You did not configure a session for the document managers');
  79. }
  80. $this->loadOdm($config['odm'], $container);
  81. if ($this->disableProxyWarmer) {
  82. $container->removeDefinition('doctrine_phpcr.odm.proxy_cache_warmer');
  83. }
  84. }
  85. $this->loadTypeGuess($container);
  86. }
  87. private function loadTypeGuess(ContainerBuilder $container): void
  88. {
  89. $types = [];
  90. $bundles = $container->getParameter('kernel.bundles');
  91. if (isset($bundles['BurgovKeyValueFormBundle'])) {
  92. $types['assoc'] = ['burgov_key_value' => ['value_type' => 'text']];
  93. }
  94. $container->setParameter('doctrine_phpcr.form.type_guess', $types);
  95. }
  96. private function sessionLoad(array $config, ContainerBuilder $container): void
  97. {
  98. $sessions = $loaded = [];
  99. foreach ($config['sessions'] as $name => $session) {
  100. if (empty($config['default_session'])) {
  101. $config['default_session'] = $name;
  102. }
  103. $session['name'] = $name;
  104. $session['service_name'] = $sessions[$name] = sprintf('doctrine_phpcr.%s_session', $name);
  105. $type = $session['backend']['type'];
  106. switch ($type) {
  107. case 'prismic':
  108. case 'doctrinedbal':
  109. case 'jackrabbit':
  110. if (empty($loaded['jackalope'])) {
  111. $this->loader->load('jackalope.xml');
  112. $loaded['jackalope'] = true;
  113. }
  114. $this->loadJackalopeSession($session, $container, $type);
  115. $this->loadJackalopeSession($session, $container, $type, true);
  116. break;
  117. default:
  118. throw new InvalidArgumentException(sprintf('You set an unsupported transport type "%s" for session "%s"', $type, $name));
  119. }
  120. }
  121. $container->setParameter('doctrine_phpcr.sessions', $sessions);
  122. // no sessions configured
  123. if (empty($config['default_session'])) {
  124. $container->setParameter('doctrine_phpcr.default_session', null);
  125. return;
  126. }
  127. if (empty($sessions[$config['default_session']])) {
  128. throw new InvalidConfigurationException(sprintf("Default session is configured to '%s' which does not match any configured session name: %s", $config['default_session'], implode(', ', array_keys($sessions))));
  129. }
  130. $this->defaultSession = $config['default_session'];
  131. $this->sessions = $sessions;
  132. $container->setParameter('doctrine_phpcr.default_session', $config['default_session']);
  133. $container->setAlias('doctrine_phpcr.session', new Alias($sessions[$config['default_session']], true));
  134. $container->setAlias(SessionInterface::class, new Alias($sessions[$config['default_session']], true));
  135. }
  136. private function loadJackalopeSession(array $session, ContainerBuilder $container, string $type, bool|string $admin = false): void
  137. {
  138. $serviceNamePrefix = $admin ? '.admin' : '';
  139. $backendParameters = [];
  140. switch ($type) {
  141. case 'doctrinedbal':
  142. $connectionName = !empty($session['backend']['connection'])
  143. ? $session['backend']['connection']
  144. : null
  145. ;
  146. if (!$this->dbalSchemaListenerLoaded) {
  147. $this->loader->load('jackalope_doctrine_dbal.xml');
  148. $this->dbalSchemaListenerLoaded = true;
  149. }
  150. $schemaListenerDefinition = $container->getDefinition('doctrine_phpcr.jackalope_doctrine_dbal.schema_listener');
  151. $eventListenerOptions = [
  152. 'connection' => $connectionName,
  153. 'event' => 'postGenerateSchema',
  154. 'lazy' => true,
  155. ];
  156. $schemaListenerTags = $schemaListenerDefinition->getTag('doctrine.event_listener');
  157. if (!\in_array($eventListenerOptions, $schemaListenerTags)) {
  158. $schemaListenerDefinition->addTag('doctrine.event_listener', $eventListenerOptions);
  159. }
  160. $connectionTargetName = $connectionName
  161. ? sprintf('doctrine.dbal.%s_connection', $connectionName)
  162. : 'database_connection'
  163. ;
  164. $connectionAliasName = sprintf('doctrine_phpcr%s.jackalope_doctrine_dbal.%s_connection', $serviceNamePrefix, $session['name']);
  165. $container->setAlias($connectionAliasName, new Alias($connectionTargetName, true));
  166. // If default connection does not exist set the first doctrine_dbal connection as default
  167. $defaultConnectionName = sprintf('doctrine_phpcr%s.jackalope_doctrine_dbal.default_connection', $serviceNamePrefix);
  168. if (!$container->hasAlias($defaultConnectionName)) {
  169. $container->setAlias($defaultConnectionName, $connectionAliasName);
  170. }
  171. $backendParameters['jackalope.doctrine_dbal_connection'] = new Reference($connectionAliasName);
  172. if (false === $admin && isset($session['backend']['caches'])) {
  173. foreach ($session['backend']['caches'] as $key => $cache) {
  174. $backendParameters['jackalope.data_caches'][$key] = new Reference($cache);
  175. }
  176. }
  177. break;
  178. case 'prismic':
  179. $backendParameters['jackalope.prismic_uri'] = $session['backend']['url'];
  180. break;
  181. case 'jackrabbit':
  182. $backendParameters['jackalope.jackrabbit_uri'] = $session['backend']['url'];
  183. break;
  184. }
  185. // pipe additional parameters unchanged to jackalope
  186. $backendParameters += $session['backend']['parameters'];
  187. if (\array_key_exists('curl_options', $session['backend']) && \count($session['backend']['curl_options'])) {
  188. $curlOptions = [];
  189. foreach ($session['backend']['curl_options'] as $option => $value) {
  190. if (!\is_int($option)) {
  191. $option = \constant($option);
  192. }
  193. $curlOptions[$option] = $value;
  194. }
  195. $backendParameters['jackalope.jackrabbit_curl_options'] = $curlOptions;
  196. }
  197. // only set this default here when we know we are jackalope
  198. if (!isset($backendParameters['jackalope.check_login_on_server'])) {
  199. $backendParameters['jackalope.check_login_on_server'] = false;
  200. }
  201. if ('doctrinedbal' === $type && $backendParameters['jackalope.check_login_on_server']) {
  202. $this->disableProxyWarmer = true;
  203. }
  204. if (isset($session['backend']['factory'])) {
  205. /*
  206. * If it is a class, pass the name as is, else assume it is
  207. * a service id and get a reference to it
  208. */
  209. if (class_exists($session['backend']['factory'])) {
  210. $backendParameters['jackalope.factory'] = $session['backend']['factory'];
  211. } else {
  212. $backendParameters['jackalope.factory'] = new Reference($session['backend']['factory']);
  213. }
  214. }
  215. $logger = null;
  216. if (!empty($session['backend']['logging'])) {
  217. $logger = new Reference('doctrine_phpcr.logger');
  218. }
  219. if (!empty($session['backend']['profiling'])) {
  220. $profilingLoggerId = 'doctrine_phpcr.logger.profiling.'.$session['name'];
  221. $profilingLoggerDef = new ChildDefinition('doctrine_phpcr.logger.profiling');
  222. if ($session['backend']['backtrace']) {
  223. $profilingLoggerDef->addMethodCall('enableBacktrace');
  224. }
  225. $container->setDefinition($profilingLoggerId, $profilingLoggerDef);
  226. $profilerLogger = new Reference($profilingLoggerId);
  227. $container->getDefinition('doctrine_phpcr.data_collector')->addMethodCall('addLogger', [$session['name'], $profilerLogger]);
  228. $stopWatchLoggerId = 'doctrine_phpcr.logger.stop_watch.'.$session['name'];
  229. $stopWatchLoggerDefinition = new ChildDefinition('doctrine_phpcr.logger.stop_watch');
  230. $container->setDefinition($stopWatchLoggerId, $stopWatchLoggerDefinition);
  231. $stopWatchLogger = new Reference($stopWatchLoggerId);
  232. $chainLogger = new ChildDefinition('doctrine_phpcr.logger.chain');
  233. $chainLogger->addMethodCall('addLogger', [$profilerLogger]);
  234. $chainLogger->addMethodCall('addLogger', [$stopWatchLogger]);
  235. if (null !== $logger) {
  236. $chainLogger->addMethodCall('addLogger', [$logger]);
  237. }
  238. $loggerId = 'doctrine_phpcr.logger.chain.'.$session['name'];
  239. $container->setDefinition($loggerId, $chainLogger);
  240. $logger = new Reference($loggerId);
  241. }
  242. if ($logger) {
  243. $backendParameters['jackalope.logger'] = $logger;
  244. }
  245. $repositoryFactory = new ChildDefinition('doctrine_phpcr.jackalope.repository.factory.'.$type);
  246. $factory = $container
  247. ->setDefinition(sprintf('doctrine_phpcr%s.jackalope.repository.%s', $serviceNamePrefix, $session['name']), $repositoryFactory)
  248. ;
  249. $factory->replaceArgument(0, $backendParameters);
  250. $username = $admin && $session['admin_username'] ? $session['admin_username'] : $session['username'];
  251. $password = $admin && $session['admin_password'] ? $session['admin_password'] : $session['password'];
  252. $credentialsService = $this->buildCredentials($container, $serviceNamePrefix, $session['name'], $username, $password);
  253. $definition = new ChildDefinition('doctrine_phpcr.jackalope.session');
  254. $factoryServiceId = sprintf('doctrine_phpcr%s.jackalope.repository.%s', $serviceNamePrefix, $session['name']);
  255. $definition->setFactory([
  256. new Reference($factoryServiceId),
  257. 'login',
  258. ]);
  259. $workspace = $admin ? null : $session['workspace'];
  260. $definition
  261. ->replaceArgument(0, $credentialsService)
  262. ->replaceArgument(1, $workspace)
  263. ;
  264. $serviceName = sprintf('doctrine_phpcr%s.%s_session', $serviceNamePrefix, $session['name']);
  265. $container->setDefinition($serviceName, $definition)->setPublic(true);
  266. foreach ($session['options'] as $key => $value) {
  267. $definition->addMethodCall('setSessionOption', [$key, $value]);
  268. }
  269. $eventManagerServiceId = sprintf('doctrine_phpcr%s.%s_session.event_manager', $serviceNamePrefix, $session['name']);
  270. $eventManagerDefinition = new ChildDefinition('doctrine_phpcr.session.event_manager');
  271. $container->setDefinition($eventManagerServiceId, $eventManagerDefinition);
  272. }
  273. private function buildCredentials(ContainerBuilder $container, string $serviceNamePrefix, string $name, ?string $username, ?string $password): ?Reference
  274. {
  275. if (null === $username && class_exists(Session::class)) {
  276. $reflection = new \ReflectionClass(Session::class);
  277. $constructorParameters = $reflection->getConstructor()->getParameters();
  278. if (\array_key_exists(3, $constructorParameters)) {
  279. if ($constructorParameters[3]->allowsNull()) {
  280. return null;
  281. }
  282. }
  283. }
  284. $credentials = new ChildDefinition('doctrine_phpcr.credentials');
  285. $credentialsServiceId = sprintf('doctrine_phpcr%s.%s_credentials', $serviceNamePrefix, $name);
  286. $container
  287. ->setDefinition($credentialsServiceId, $credentials)
  288. ->replaceArgument(0, $username)
  289. ->replaceArgument(1, $password);
  290. return new Reference($credentialsServiceId);
  291. }
  292. private function loadOdm(array $config, ContainerBuilder $container): void
  293. {
  294. $this->loader->load('odm.xml');
  295. $this->loadOdmLocales($config, $container);
  296. $config['document_managers'] = $this->fixManagersAutoMappings($config['document_managers'], $container->getParameter('kernel.bundles'));
  297. $documentManagers = [];
  298. foreach ($config['document_managers'] as $name => $documentManager) {
  299. if (empty($config['default_document_manager'])) {
  300. $config['default_document_manager'] = $name;
  301. }
  302. $documentManager['name'] = $name;
  303. $documentManager['service_name'] = $documentManagers[$name] = sprintf('doctrine_phpcr.odm.%s_document_manager', $name);
  304. $this->loadOdmDocumentManager($documentManager, $container);
  305. }
  306. $container->setParameter('doctrine_phpcr.odm.document_managers', $documentManagers);
  307. // no document manager configured
  308. if (empty($config['default_document_manager'])) {
  309. return;
  310. }
  311. $container->setParameter('doctrine_phpcr.odm.default_document_manager', $config['default_document_manager']);
  312. $container->setAlias('doctrine_phpcr.odm.document_manager', new Alias($documentManagers[$config['default_document_manager']], true));
  313. $container->setAlias(DocumentManagerInterface::class, new Alias($documentManagers[$config['default_document_manager']]));
  314. $options = ['auto_generate_proxy_classes', 'proxy_dir', 'proxy_namespace'];
  315. foreach ($options as $key) {
  316. $container->setParameter('doctrine_phpcr.odm.'.$key, $config[$key]);
  317. }
  318. if (!$config['namespaces']['translation']['alias']) {
  319. throw new InvalidArgumentException(
  320. 'Translation namespace alias must not be empty'
  321. );
  322. }
  323. $container->setParameter('doctrine_phpcr.odm.namespaces.translation.alias', $config['namespaces']['translation']['alias']);
  324. }
  325. private function loadOdmLocales(array $config, ContainerBuilder $container): void
  326. {
  327. $localeChooser = $config['locale_chooser'];
  328. if (empty($config['locales']) && null === $config['locale_chooser']) {
  329. return;
  330. }
  331. if (!empty($config['locales'])) {
  332. $this->loader->load('odm_multilang.xml');
  333. foreach ($config['locales'] as $locale => $fallbacks) {
  334. if (\in_array($locale, $fallbacks)) {
  335. throw new InvalidArgumentException(sprintf('The fallbacks for locale %s contain the locale itself.', $locale));
  336. }
  337. if (\count($fallbacks) !== \count(array_unique($fallbacks))) {
  338. throw new InvalidArgumentException(sprintf('Duplicate locale in the fallbacks for locale %s.', $locale));
  339. }
  340. }
  341. $container->setParameter('doctrine_phpcr.odm.locales', $config['locales']);
  342. $container->setParameter('doctrine_phpcr.odm.allowed_locales', array_keys($config['locales']));
  343. if (isset($config['default_locale']) && null !== $config['default_locale']) {
  344. $defaultLocale = $config['default_locale'];
  345. if (!isset($config['locales'][$defaultLocale])) {
  346. throw new InvalidConfigurationException('Default locale must be listed in locale list');
  347. }
  348. } else {
  349. $defaultLocale = key($config['locales']);
  350. }
  351. $container->setParameter('doctrine_phpcr.odm.default_locale', $defaultLocale);
  352. $container->setParameter('doctrine_phpcr.odm.locale_fallback', $config['locale_fallback']);
  353. $localeChooser = $localeChooser ?: 'doctrine_phpcr.odm.locale_chooser';
  354. }
  355. // only set the locale chooser if it has been explicitly configured or implicitly
  356. // set by configuring the locales node.
  357. if (null !== $localeChooser) {
  358. $dm = $container->getDefinition('doctrine_phpcr.odm.document_manager.abstract');
  359. $dm->addMethodCall('setLocaleChooserStrategy', [new Reference($localeChooser)]);
  360. }
  361. }
  362. private function loadOdmDocumentManager(array $documentManager, ContainerBuilder $container): void
  363. {
  364. $odmConfigDefTemplate = empty($documentManager['configuration_id']) ? 'doctrine_phpcr.odm.configuration' : $documentManager['configuration_id'];
  365. $odmConfigDefDefinition = new ChildDefinition($odmConfigDefTemplate);
  366. $odmConfigDef = $container->setDefinition(sprintf('doctrine_phpcr.odm.%s_configuration', $documentManager['name']), $odmConfigDefDefinition);
  367. $this->loadOdmDocumentManagerMappingInformation($documentManager, $odmConfigDef, $container);
  368. $this->loadOdmCacheDrivers($documentManager, $container);
  369. $methods = [
  370. 'setMetadataCacheImpl' => [new Reference(sprintf('doctrine_phpcr.odm.%s_metadata_cache', $documentManager['name']))],
  371. 'setMetadataDriverImpl' => [new Reference('doctrine_phpcr.odm.'.$documentManager['name'].'_metadata_driver'), false],
  372. 'setProxyDir' => ['%doctrine_phpcr.odm.proxy_dir%'],
  373. 'setProxyNamespace' => ['%doctrine_phpcr.odm.proxy_namespace%'],
  374. 'setAutoGenerateProxyClasses' => ['%doctrine_phpcr.odm.auto_generate_proxy_classes%'],
  375. ];
  376. $methods['setClassMetadataFactoryName'] = [$documentManager['class_metadata_factory_name']];
  377. $methods['setDefaultRepositoryClassName'] = [$documentManager['default_repository_class']];
  378. if ($documentManager['repository_factory']) {
  379. $methods['setRepositoryFactory'] = [new Reference($documentManager['repository_factory'])];
  380. }
  381. foreach ($methods as $method => $args) {
  382. $odmConfigDef->addMethodCall($method, $args);
  383. }
  384. if (!isset($documentManager['session'])) {
  385. $documentManager['session'] = $this->defaultSession;
  386. }
  387. if (!isset($this->sessions[$documentManager['session']])) {
  388. throw new InvalidArgumentException(sprintf("You have configured a non existent session '%s' for the document manager '%s'", $documentManager['session'], $documentManager['name']));
  389. }
  390. $abstractDocumentManagerDefinition = new ChildDefinition('doctrine_phpcr.odm.document_manager.abstract');
  391. $documentManagerDefinition = $container
  392. ->setDefinition($documentManager['service_name'], $abstractDocumentManagerDefinition)
  393. ->setArguments([
  394. new Reference(sprintf('doctrine_phpcr.%s_session', $documentManager['session'])),
  395. new Reference(sprintf('doctrine_phpcr.odm.%s_configuration', $documentManager['name'])),
  396. new Reference(sprintf('doctrine_phpcr.%s_session.event_manager', $documentManager['session'])),
  397. ])
  398. ->setPublic(true);
  399. foreach ([
  400. 'child' => 'doctrine_phpcr.odm.translation.strategy.child',
  401. 'attribute' => 'doctrine_phpcr.odm.translation.strategy.attribute',
  402. ] as $name => $strategyTemplateId) {
  403. $strategyId = sprintf('doctrine_phpcr.odm.%s.translation.strategy.%s', $documentManager['name'], $name);
  404. $strategyDefinition = new ChildDefinition($strategyTemplateId);
  405. $container->setDefinition($strategyId, $strategyDefinition);
  406. $strategyDefinition->replaceArgument(0, new Reference($documentManager['service_name']));
  407. $documentManagerDefinition->addMethodCall('setTranslationStrategy', [$name, new Reference($strategyId)]);
  408. }
  409. }
  410. private function loadOdmDocumentManagerMappingInformation(array $documentManager, Definition $odmConfig, ContainerBuilder $container): void
  411. {
  412. // reset state of drivers map. It is only used by this methods and children.
  413. $this->drivers = [];
  414. if (!class_exists(Generic::class)) {
  415. throw new \RuntimeException('PHPCR ODM is activated in the config but does not seem loadable.');
  416. }
  417. $class = new \ReflectionClass(Generic::class);
  418. $documentManager['mappings']['__PHPCRODM__'] = [
  419. 'dir' => \dirname($class->getFileName()),
  420. 'type' => 'attribute',
  421. 'prefix' => 'Doctrine\ODM\PHPCR\Document',
  422. 'is_bundle' => false,
  423. 'mapping' => true,
  424. ];
  425. $this->loadMappingInformation($documentManager, $container);
  426. $this->registerMappingDrivers($documentManager, $container);
  427. }
  428. /**
  429. * Loads a configured document managers cache drivers.
  430. *
  431. * @param array $documentManager a configured ORM document manager
  432. * @param ContainerBuilder $container A ContainerBuilder instance
  433. */
  434. private function loadOdmCacheDrivers(array $documentManager, ContainerBuilder $container): void
  435. {
  436. $this->loadCacheDriver('metadata_cache', $documentManager['name'], $documentManager['metadata_cache_driver'], $container);
  437. }
  438. /**
  439. * Prevent calling the generic method from the Symfony bridge.
  440. */
  441. protected function loadObjectManagerCacheDriver(array $objectManager, ContainerBuilder $container, $cacheName): void
  442. {
  443. $this->loadCacheDriver($cacheName, $objectManager['name'], $objectManager[$cacheName.'_driver'], $container);
  444. }
  445. protected function loadCacheDriver($cacheName, $objectManagerName, array $cacheDriver, ContainerBuilder $container): string
  446. {
  447. $aliasId = $this->getObjectManagerElementName(sprintf('%s_%s', $objectManagerName, $cacheName));
  448. switch ($cacheDriver['type']) {
  449. case 'service':
  450. $serviceId = $cacheDriver['id'];
  451. break;
  452. case 'array':
  453. $serviceId = $this->createArrayAdapterCachePool($container, $objectManagerName, $cacheName);
  454. break;
  455. default:
  456. throw new InvalidArgumentException(sprintf(
  457. 'Unknown cache of type "%s" configured for cache "%s" in entity manager "%s".',
  458. $cacheDriver['type'],
  459. $cacheName,
  460. $objectManagerName
  461. ));
  462. }
  463. $container->setAlias($aliasId, new Alias($serviceId, false));
  464. return $aliasId;
  465. }
  466. private function createArrayAdapterCachePool(ContainerBuilder $container, string $objectManagerName, string $cacheName): string
  467. {
  468. $id = sprintf('cache.doctrine.phpcr_odm.%s.%s', $objectManagerName, str_replace('_cache', '', $cacheName));
  469. $poolDefinition = $container->register($id, ArrayAdapter::class);
  470. $poolDefinition->addTag('cache.pool');
  471. $container->setDefinition($id, $poolDefinition);
  472. return $id;
  473. }
  474. protected function getMappingObjectDefaultName(): string
  475. {
  476. return 'Document';
  477. }
  478. protected function getMappingResourceConfigDirectory(?string $bundleDir = null): string
  479. {
  480. return 'Resources/config/doctrine';
  481. }
  482. protected function getMappingResourceExtension(): string
  483. {
  484. return 'phpcr';
  485. }
  486. public function getNamespace(): string
  487. {
  488. return 'http://doctrine-project.org/schema/symfony-dic/odm/phpcr';
  489. }
  490. protected function getMetadataDriverClass(string $driverType): string
  491. {
  492. return '%'.$this->getObjectManagerElementName('metadata.'.$driverType.'.class%');
  493. }
  494. protected function getObjectManagerElementName(string $name): string
  495. {
  496. return 'doctrine_phpcr.odm.'.$name;
  497. }
  498. }