vendor/doctrine/mongodb-odm-bundle/DependencyInjection/DoctrineMongoDBExtension.php line 377

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Doctrine\Bundle\MongoDBBundle\DependencyInjection;
  4. use Doctrine\Bundle\MongoDBBundle\Attribute\AsDocumentListener;
  5. use Doctrine\Bundle\MongoDBBundle\DependencyInjection\Compiler\FixturesCompilerPass;
  6. use Doctrine\Bundle\MongoDBBundle\DependencyInjection\Compiler\ServiceRepositoryCompilerPass;
  7. use Doctrine\Bundle\MongoDBBundle\EventSubscriber\EventSubscriberInterface;
  8. use Doctrine\Bundle\MongoDBBundle\Fixture\ODMFixtureInterface;
  9. use Doctrine\Bundle\MongoDBBundle\Repository\ServiceDocumentRepositoryInterface;
  10. use Doctrine\Common\Cache\MemcacheCache;
  11. use Doctrine\Common\Cache\RedisCache;
  12. use Doctrine\Common\DataFixtures\Loader as DataFixturesLoader;
  13. use Doctrine\Common\EventSubscriber;
  14. use Doctrine\ODM\MongoDB\DocumentManager;
  15. use InvalidArgumentException;
  16. use Jean85\PrettyVersions;
  17. use Symfony\Bridge\Doctrine\DependencyInjection\AbstractDoctrineExtension;
  18. use Symfony\Bridge\Doctrine\Messenger\DoctrineClearEntityManagerWorkerSubscriber;
  19. use Symfony\Component\Cache\Adapter\ApcuAdapter;
  20. use Symfony\Component\Cache\Adapter\ArrayAdapter;
  21. use Symfony\Component\Cache\Adapter\MemcachedAdapter;
  22. use Symfony\Component\Cache\Adapter\RedisAdapter;
  23. use Symfony\Component\Config\Definition\BaseNode;
  24. use Symfony\Component\Config\FileLocator;
  25. use Symfony\Component\DependencyInjection\Alias;
  26. use Symfony\Component\DependencyInjection\ChildDefinition;
  27. use Symfony\Component\DependencyInjection\ContainerBuilder;
  28. use Symfony\Component\DependencyInjection\Definition;
  29. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  30. use Symfony\Component\DependencyInjection\Reference;
  31. use Symfony\Component\Messenger\MessageBusInterface;
  32. use Throwable;
  33. use function array_keys;
  34. use function array_merge;
  35. use function class_exists;
  36. use function class_implements;
  37. use function in_array;
  38. use function interface_exists;
  39. use function is_dir;
  40. use function method_exists;
  41. use function reset;
  42. use function sprintf;
  43. /**
  44.  * Doctrine MongoDB ODM extension.
  45.  */
  46. class DoctrineMongoDBExtension extends AbstractDoctrineExtension
  47. {
  48.     /** @var string */
  49.     private static $odmVersion;
  50.     /** @internal */
  51.     public const CONFIGURATION_TAG 'doctrine.odm.configuration';
  52.     /**
  53.      * Responds to the doctrine_mongodb configuration parameter.
  54.      */
  55.     public function load(array $configsContainerBuilder $container)
  56.     {
  57.         // Load DoctrineMongoDBBundle/Resources/config/mongodb.xml
  58.         $loader = new XmlFileLoader($container, new FileLocator(__DIR__ '/../Resources/config'));
  59.         $configuration = new Configuration();
  60.         $config        $this->processConfiguration($configuration$configs);
  61.         $loader->load('mongodb.xml');
  62.         if (empty($config['default_connection'])) {
  63.             $keys                         array_keys($config['connections']);
  64.             $config['default_connection'] = reset($keys);
  65.         }
  66.         $container->setParameter('doctrine_mongodb.odm.default_connection'$config['default_connection']);
  67.         if (empty($config['default_document_manager'])) {
  68.             $keys                               array_keys($config['document_managers']);
  69.             $config['default_document_manager'] = reset($keys);
  70.         }
  71.         $container->setParameter('doctrine_mongodb.odm.default_document_manager'$config['default_document_manager']);
  72.         if (! empty($config['types'])) {
  73.             $configuratorDefinition $container->getDefinition('doctrine_mongodb.odm.manager_configurator.abstract');
  74.             $configuratorDefinition->addMethodCall('loadTypes', [$config['types']]);
  75.         }
  76.         // set some options as parameters and unset them
  77.         $config $this->overrideParameters($config$container);
  78.         if (class_exists(DataFixturesLoader::class)) {
  79.             // set the fixtures loader
  80.             $container->setParameter('doctrine_mongodb.odm.fixture_loader'$config['fixture_loader']);
  81.             // Autowiring fixture loader
  82.             $container->registerForAutoconfiguration(ODMFixtureInterface::class)
  83.                 ->addTag(FixturesCompilerPass::FIXTURE_TAG);
  84.         } else {
  85.             $container->removeDefinition('doctrine_mongodb.odm.symfony.fixtures.loader');
  86.         }
  87.         // load the connections
  88.         $this->loadConnections($config['connections'], $container);
  89.         $config['document_managers'] = $this->fixManagersAutoMappings($config['document_managers'], $container->getParameter('kernel.bundles'));
  90.         // load the document managers
  91.         $this->loadDocumentManagers(
  92.             $config['document_managers'],
  93.             $config['default_document_manager'],
  94.             $config['default_database'],
  95.             $container
  96.         );
  97.         if ($config['resolve_target_documents']) {
  98.             $def $container->findDefinition('doctrine_mongodb.odm.listeners.resolve_target_document');
  99.             foreach ($config['resolve_target_documents'] as $name => $implementation) {
  100.                 $def->addMethodCall('addResolveTargetDocument', [$name$implementation, []]);
  101.             }
  102.             // Register service has an event subscriber if implement interface
  103.             if (in_array(EventSubscriber::class, class_implements($container->getParameterBag()->resolveValue($def->getClass())))) {
  104.                 $def->addTag('doctrine_mongodb.odm.event_subscriber');
  105.             } else {
  106.                 $def->addTag('doctrine_mongodb.odm.event_listener', ['event' => 'loadClassMetadata']);
  107.             }
  108.         }
  109.         $container->registerForAutoconfiguration(ServiceDocumentRepositoryInterface::class)
  110.             ->addTag(ServiceRepositoryCompilerPass::REPOSITORY_SERVICE_TAG);
  111.         $container->registerForAutoconfiguration(EventSubscriberInterface::class)
  112.             ->addTag('doctrine_mongodb.odm.event_subscriber');
  113.         if (method_exists($container'registerAttributeForAutoconfiguration')) {
  114.             $container->registerAttributeForAutoconfiguration(AsDocumentListener::class, static function (ChildDefinition $definitionAsDocumentListener $attribute) {
  115.                 $definition->addTag('doctrine_mongodb.odm.event_listener', [
  116.                     'event'      => $attribute->event,
  117.                     'method'     => $attribute->method,
  118.                     'lazy'       => $attribute->lazy,
  119.                     'connection' => $attribute->connection,
  120.                 ]);
  121.             });
  122.         }
  123.         $this->loadMessengerServices($container);
  124.     }
  125.     /**
  126.      * Uses some of the extension options to override DI extension parameters.
  127.      *
  128.      * @param array            $options   The available configuration options
  129.      * @param ContainerBuilder $container A ContainerBuilder instance
  130.      *
  131.      * @return array<string, mixed>
  132.      */
  133.     protected function overrideParameters($optionsContainerBuilder $container)
  134.     {
  135.         $overrides = [
  136.             'proxy_namespace',
  137.             'proxy_dir',
  138.             'auto_generate_proxy_classes',
  139.             'hydrator_namespace',
  140.             'hydrator_dir',
  141.             'auto_generate_hydrator_classes',
  142.             'default_commit_options',
  143.             'persistent_collection_dir',
  144.             'persistent_collection_namespace',
  145.             'auto_generate_persistent_collection_classes',
  146.         ];
  147.         foreach ($overrides as $key) {
  148.             if (! isset($options[$key])) {
  149.                 continue;
  150.             }
  151.             $container->setParameter('doctrine_mongodb.odm.' $key$options[$key]);
  152.             // the option should not be used, the parameter should be referenced
  153.             unset($options[$key]);
  154.         }
  155.         return $options;
  156.     }
  157.     /**
  158.      * Loads the document managers configuration.
  159.      *
  160.      * @param array            $dmConfigs An array of document manager configs
  161.      * @param string           $defaultDM The default document manager name
  162.      * @param string           $defaultDB The default db name
  163.      * @param ContainerBuilder $container A ContainerBuilder instance
  164.      */
  165.     protected function loadDocumentManagers(array $dmConfigs$defaultDM$defaultDBContainerBuilder $container)
  166.     {
  167.         $dms = [];
  168.         foreach ($dmConfigs as $name => $documentManager) {
  169.             $documentManager['name'] = $name;
  170.             $this->loadDocumentManager(
  171.                 $documentManager,
  172.                 $defaultDM,
  173.                 $defaultDB,
  174.                 $container
  175.             );
  176.             $dms[$name] = sprintf('doctrine_mongodb.odm.%s_document_manager'$name);
  177.         }
  178.         $container->setParameter('doctrine_mongodb.odm.document_managers'$dms);
  179.     }
  180.     /**
  181.      * Loads a document manager configuration.
  182.      *
  183.      * @param array            $documentManager A document manager configuration array
  184.      * @param string           $defaultDM       The default document manager name
  185.      * @param string           $defaultDB       The default db name
  186.      * @param ContainerBuilder $container       A ContainerBuilder instance
  187.      */
  188.     protected function loadDocumentManager(array $documentManager$defaultDM$defaultDBContainerBuilder $container)
  189.     {
  190.         $connectionName  $documentManager['connection'] ?? $documentManager['name'];
  191.         $configurationId sprintf('doctrine_mongodb.odm.%s_configuration'$documentManager['name']);
  192.         $defaultDatabase $documentManager['database'] ?? $defaultDB;
  193.         $odmConfigDef = new Definition('%doctrine_mongodb.odm.configuration.class%');
  194.         $odmConfigDef->addTag(self::CONFIGURATION_TAG);
  195.         $container->setDefinition(
  196.             $configurationId,
  197.             $odmConfigDef
  198.         );
  199.         $this->loadDocumentManagerBundlesMappingInformation($documentManager$odmConfigDef$container);
  200.         $this->loadObjectManagerCacheDriver($documentManager$container'metadata_cache');
  201.         $methods = [
  202.             'setMetadataCache' => new Reference(sprintf('doctrine_mongodb.odm.%s_metadata_cache'$documentManager['name'])),
  203.             'setMetadataDriverImpl' => new Reference(sprintf('doctrine_mongodb.odm.%s_metadata_driver'$documentManager['name'])),
  204.             'setProxyDir' => '%doctrine_mongodb.odm.proxy_dir%',
  205.             'setProxyNamespace' => '%doctrine_mongodb.odm.proxy_namespace%',
  206.             'setAutoGenerateProxyClasses' => '%doctrine_mongodb.odm.auto_generate_proxy_classes%',
  207.             'setHydratorDir' => '%doctrine_mongodb.odm.hydrator_dir%',
  208.             'setHydratorNamespace' => '%doctrine_mongodb.odm.hydrator_namespace%',
  209.             'setAutoGenerateHydratorClasses' => '%doctrine_mongodb.odm.auto_generate_hydrator_classes%',
  210.             'setDefaultDB' => $defaultDatabase,
  211.             'setDefaultCommitOptions' => '%doctrine_mongodb.odm.default_commit_options%',
  212.             'setDefaultDocumentRepositoryClassName' => $documentManager['default_document_repository_class'],
  213.             'setDefaultGridFSRepositoryClassName' => $documentManager['default_gridfs_repository_class'],
  214.             'setPersistentCollectionDir' => '%doctrine_mongodb.odm.persistent_collection_dir%',
  215.             'setPersistentCollectionNamespace' => '%doctrine_mongodb.odm.persistent_collection_namespace%',
  216.             'setAutoGeneratePersistentCollectionClasses' => '%doctrine_mongodb.odm.auto_generate_persistent_collection_classes%',
  217.         ];
  218.         if ($documentManager['repository_factory']) {
  219.             $methods['setRepositoryFactory'] = new Reference($documentManager['repository_factory']);
  220.         }
  221.         if ($documentManager['persistent_collection_factory']) {
  222.             $methods['setPersistentCollectionFactory'] = new Reference($documentManager['persistent_collection_factory']);
  223.         }
  224.         $container->getAlias('doctrine_mongodb.odm.command_logger')
  225.             ->setDeprecated(...$this->buildDeprecationArgs(
  226.                 '4.4',
  227.                 'The service %alias_id% is deprecated and will be dropped in DoctrineMongoDBBundle 5.0. Use "doctrine_mongodb.odm.psr_command_logger" instead.'
  228.             ));
  229.         // logging
  230.         if ($container->getParameterBag()->resolveValue($documentManager['logging'])) {
  231.             $container->getDefinition('doctrine_mongodb.odm.psr_command_logger')
  232.                 ->addTag('doctrine_mongodb.odm.command_logger');
  233.         }
  234.         // profiler
  235.         if ($container->getParameterBag()->resolveValue($documentManager['profiler']['enabled'])) {
  236.             $container->getDefinition('doctrine_mongodb.odm.data_collector.command_logger')
  237.                 ->addTag('doctrine_mongodb.odm.command_logger');
  238.             $container->getDefinition('doctrine_mongodb.odm.stopwatch_command_logger')
  239.                 ->addTag('doctrine_mongodb.odm.command_logger');
  240.             $container
  241.                 ->getDefinition('doctrine_mongodb.odm.data_collector')
  242.                 ->addTag('data_collector', ['id' => 'mongodb''template' => '@DoctrineMongoDB/Collector/mongodb.html.twig']);
  243.         }
  244.         $enabledFilters = [];
  245.         foreach ($documentManager['filters'] as $name => $filter) {
  246.             $parameters $filter['parameters'] ?? [];
  247.             $odmConfigDef->addMethodCall('addFilter', [$name$filter['class'], $parameters]);
  248.             if (! $filter['enabled']) {
  249.                 continue;
  250.             }
  251.             $enabledFilters[] = $name;
  252.         }
  253.         $managerConfiguratorName sprintf('doctrine_mongodb.odm.%s_manager_configurator'$documentManager['name']);
  254.         $container
  255.             ->setDefinition(
  256.                 $managerConfiguratorName,
  257.                 new ChildDefinition('doctrine_mongodb.odm.manager_configurator.abstract')
  258.             )
  259.             ->replaceArgument(0$enabledFilters);
  260.         foreach ($methods as $method => $arg) {
  261.             if ($odmConfigDef->hasMethodCall($method)) {
  262.                 $odmConfigDef->removeMethodCall($method);
  263.             }
  264.             $odmConfigDef->addMethodCall($method, [$arg]);
  265.         }
  266.         $odmDmArgs = [
  267.             new Reference(sprintf('doctrine_mongodb.odm.%s_connection'$connectionName)),
  268.             new Reference($configurationId),
  269.             // Document managers will share their connection's event manager
  270.             new Reference(sprintf('doctrine_mongodb.odm.%s_connection.event_manager'$connectionName)),
  271.         ];
  272.         $odmDmDef  = new Definition('%doctrine_mongodb.odm.document_manager.class%'$odmDmArgs);
  273.         $odmDmDef->setFactory(['%doctrine_mongodb.odm.document_manager.class%''create']);
  274.         $odmDmDef->addTag('doctrine_mongodb.odm.document_manager');
  275.         $odmDmDef->setPublic(true);
  276.         $container
  277.             ->setDefinition(sprintf('doctrine_mongodb.odm.%s_document_manager'$documentManager['name']), $odmDmDef)
  278.             ->setConfigurator([new Reference($managerConfiguratorName), 'configure']);
  279.         if ($documentManager['name'] !== $defaultDM) {
  280.             return;
  281.         }
  282.         $container->setAlias(
  283.             'doctrine_mongodb.odm.document_manager',
  284.             new Alias(sprintf('doctrine_mongodb.odm.%s_document_manager'$documentManager['name']))
  285.         );
  286.         $container->getAlias('doctrine_mongodb.odm.document_manager')->setPublic(true);
  287.         $container->setAlias(
  288.             'doctrine_mongodb.odm.event_manager',
  289.             new Alias(sprintf('doctrine_mongodb.odm.%s_connection.event_manager'$connectionName))
  290.         );
  291.     }
  292.     /**
  293.      * Loads the configured connections.
  294.      *
  295.      * @param array            $config    An array of connections configurations
  296.      * @param ContainerBuilder $container A ContainerBuilder instance
  297.      */
  298.     protected function loadConnections(array $connectionsContainerBuilder $container)
  299.     {
  300.         $cons = [];
  301.         foreach ($connections as $name => $connection) {
  302.             // Define an event manager for this connection
  303.             $eventManagerId sprintf('doctrine_mongodb.odm.%s_connection.event_manager'$name);
  304.             $container->setDefinition(
  305.                 $eventManagerId,
  306.                 new ChildDefinition('doctrine_mongodb.odm.connection.event_manager')
  307.             );
  308.             $configurationId sprintf('doctrine_mongodb.odm.%s_configuration'$name);
  309.             $container->setDefinition(
  310.                 $configurationId,
  311.                 new Definition('%doctrine_mongodb.odm.configuration.class%')
  312.             );
  313.             $odmConnArgs = [
  314.                 $connection['server'] ?? null,
  315.                 /* phpcs:ignore Squiz.Arrays.ArrayDeclaration.ValueNoNewline */
  316.                 $connection['options'] ?? [],
  317.                 $this->normalizeDriverOptions($connection),
  318.             ];
  319.             $odmConnDef = new Definition('%doctrine_mongodb.odm.connection.class%'$odmConnArgs);
  320.             $odmConnDef->setPublic(true);
  321.             $id sprintf('doctrine_mongodb.odm.%s_connection'$name);
  322.             $container->setDefinition($id$odmConnDef);
  323.             $cons[$name] = $id;
  324.         }
  325.         $container->setParameter('doctrine_mongodb.odm.connections'$cons);
  326.     }
  327.     private function loadMessengerServices(ContainerBuilder $container)
  328.     {
  329.         /** @psalm-suppress UndefinedClass Optional dependency */
  330.         if (! interface_exists(MessageBusInterface::class) || ! class_exists(DoctrineClearEntityManagerWorkerSubscriber::class)) {
  331.             return;
  332.         }
  333.         $loader = new XmlFileLoader($container, new FileLocator(__DIR__ '/../Resources/config'));
  334.         $loader->load('messenger.xml');
  335.     }
  336.     /**
  337.      * Normalizes the driver options array
  338.      *
  339.      * @param array $connection
  340.      *
  341.      * @return array|null
  342.      */
  343.     private function normalizeDriverOptions(array $connection)
  344.     {
  345.         $driverOptions            $connection['driver_options'] ?? [];
  346.         $driverOptions['typeMap'] = DocumentManager::CLIENT_TYPEMAP;
  347.         if (isset($driverOptions['context'])) {
  348.             $driverOptions['context'] = new Reference($driverOptions['context']);
  349.         }
  350.         $driverOptions['driver'] = [
  351.             'name' => 'symfony-mongodb',
  352.             'version' => self::getODMVersion(),
  353.         ];
  354.         return $driverOptions;
  355.     }
  356.     /**
  357.      * Loads an ODM document managers bundle mapping information.
  358.      *
  359.      * There are two distinct configuration possibilities for mapping information:
  360.      *
  361.      * 1. Specify a bundle and optionally details where the entity and mapping information reside.
  362.      * 2. Specify an arbitrary mapping location.
  363.      *
  364.      * @param array            $documentManager A configured ODM entity manager.
  365.      * @param Definition       $odmConfigDef    A Definition instance
  366.      * @param ContainerBuilder $container       A ContainerBuilder instance
  367.      *
  368.      * @example
  369.      *
  370.      *  doctrine_mongodb:
  371.      *     mappings:
  372.      *         MyBundle1: ~
  373.      *         MyBundle2: xml
  374.      *         MyBundle3: { type: annotation, dir: Documents/ }
  375.      *         MyBundle4: { type: xml, dir: Resources/config/doctrine/mapping }
  376.      *         MyBundle5:
  377.      *             type: xml
  378.      *             dir: [bundle-mappings1/, bundle-mappings2/]
  379.      *             alias: BundleAlias
  380.      *         arbitrary_key:
  381.      *             type: xml
  382.      *             dir: %kernel.dir%/../src/vendor/DoctrineExtensions/lib/DoctrineExtensions/Documents
  383.      *             prefix: DoctrineExtensions\Documents\
  384.      *             alias: DExt
  385.      *
  386.      * In the case of bundles everything is really optional (which leads to autodetection for this bundle) but
  387.      * in the mappings key everything except alias is a required argument.
  388.      */
  389.     protected function loadDocumentManagerBundlesMappingInformation(array $documentManagerDefinition $odmConfigDefContainerBuilder $container)
  390.     {
  391.         // reset state of drivers and alias map. They are only used by this methods and children.
  392.         $this->drivers  = [];
  393.         $this->aliasMap = [];
  394.         $this->loadMappingInformation($documentManager$container);
  395.         $this->registerMappingDrivers($documentManager$container);
  396.         if ($odmConfigDef->hasMethodCall('setDocumentNamespaces')) {
  397.             // TODO: Can we make a method out of it on Definition? replaceMethodArguments() or something.
  398.             $calls $odmConfigDef->getMethodCalls();
  399.             foreach ($calls as $call) {
  400.                 if ($call[0] !== 'setDocumentNamespaces') {
  401.                     continue;
  402.                 }
  403.                 $this->aliasMap array_merge($call[1][0], $this->aliasMap);
  404.             }
  405.             $method $odmConfigDef->removeMethodCall('setDocumentNamespaces');
  406.         }
  407.         $odmConfigDef->addMethodCall('setDocumentNamespaces', [$this->aliasMap]);
  408.     }
  409.     /** @param string $name */
  410.     protected function getObjectManagerElementName($name): string
  411.     {
  412.         return 'doctrine_mongodb.odm.' $name;
  413.     }
  414.     protected function getMappingObjectDefaultName(): string
  415.     {
  416.         return 'Document';
  417.     }
  418.     protected function getMappingResourceConfigDirectory(?string $bundleDir null): string
  419.     {
  420.         if ($bundleDir !== null && is_dir($bundleDir '/config/doctrine')) {
  421.             return 'config/doctrine';
  422.         }
  423.         return 'Resources/config/doctrine';
  424.     }
  425.     protected function getMappingResourceExtension(): string
  426.     {
  427.         return 'mongodb';
  428.     }
  429.     protected function getMetadataDriverClass(string $driverType): string
  430.     {
  431.         return '%' $this->getObjectManagerElementName('metadata.' $driverType '.class') . '%';
  432.     }
  433.     public function getAlias(): string
  434.     {
  435.         return 'doctrine_mongodb';
  436.     }
  437.     /**
  438.      * Returns the namespace to be used for this extension (XML namespace).
  439.      *
  440.      * @return string The XML namespace
  441.      */
  442.     public function getNamespace()
  443.     {
  444.         return 'http://symfony.com/schema/dic/doctrine/odm/mongodb';
  445.     }
  446.     /** @return string */
  447.     public function getXsdValidationBasePath()
  448.     {
  449.         return __DIR__ '/../Resources/config/schema';
  450.     }
  451.     /**
  452.      * Loads a cache driver.
  453.      *
  454.      * @param string $cacheName         The cache driver name
  455.      * @param string $objectManagerName The object manager name
  456.      * @param array  $cacheDriver       The cache driver mapping
  457.      *
  458.      * @throws InvalidArgumentException
  459.      *
  460.      * @psalm-suppress UndefinedClass this won't be necessary when removing metadata cache configuration
  461.      */
  462.     protected function loadCacheDriver($cacheName$objectManagerName, array $cacheDriverContainerBuilder $container): string
  463.     {
  464.         if (isset($cacheDriver['namespace'])) {
  465.             return parent::loadCacheDriver($cacheName$objectManagerName$cacheDriver$container);
  466.         }
  467.         $cacheDriverServiceId $this->getObjectManagerElementName($objectManagerName '_' $cacheName);
  468.         switch ($cacheDriver['type']) {
  469.             case 'service':
  470.                 $container->setAlias($cacheDriverServiceId, new Alias($cacheDriver['id'], false));
  471.                 return $cacheDriverServiceId;
  472.             case 'memcached':
  473.                 if (! empty($cacheDriver['class']) && $cacheDriver['class'] !== MemcacheCache::class) {
  474.                     return parent::loadCacheDriver($cacheName$objectManagerName$cacheDriver$container);
  475.                 }
  476.                 $memcachedInstanceClass = ! empty($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%' $this->getObjectManagerElementName('cache.memcached_instance.class') . '%';
  477.                 $memcachedHost          = ! empty($cacheDriver['host']) ? $cacheDriver['host'] : '%' $this->getObjectManagerElementName('cache.memcached_host') . '%';
  478.                 $memcachedPort          = ! empty($cacheDriver['port']) ? $cacheDriver['port'] : '%' $this->getObjectManagerElementName('cache.memcached_port') . '%';
  479.                 $memcachedInstance      = new Definition($memcachedInstanceClass);
  480.                 $memcachedInstance->addMethodCall('addServer', [
  481.                     $memcachedHost,
  482.                     $memcachedPort,
  483.                 ]);
  484.                 $container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcached_instance'$objectManagerName)), $memcachedInstance);
  485.                 $cacheDef = new Definition(MemcachedAdapter::class, [new Reference($this->getObjectManagerElementName(sprintf('%s_memcached_instance'$objectManagerName)))]);
  486.                 break;
  487.             case 'redis':
  488.                 if (! empty($cacheDriver['class']) && $cacheDriver['class'] !== RedisCache::class) {
  489.                     return parent::loadCacheDriver($cacheName$objectManagerName$cacheDriver$container);
  490.                 }
  491.                 $redisInstanceClass = ! empty($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%' $this->getObjectManagerElementName('cache.redis_instance.class') . '%';
  492.                 $redisHost          = ! empty($cacheDriver['host']) ? $cacheDriver['host'] : '%' $this->getObjectManagerElementName('cache.redis_host') . '%';
  493.                 $redisPort          = ! empty($cacheDriver['port']) ? $cacheDriver['port'] : '%' $this->getObjectManagerElementName('cache.redis_port') . '%';
  494.                 $redisInstance      = new Definition($redisInstanceClass);
  495.                 $redisInstance->addMethodCall('connect', [
  496.                     $redisHost,
  497.                     $redisPort,
  498.                 ]);
  499.                 $container->setDefinition($this->getObjectManagerElementName(sprintf('%s_redis_instance'$objectManagerName)), $redisInstance);
  500.                 $cacheDef = new Definition(RedisAdapter::class, [new Reference($this->getObjectManagerElementName(sprintf('%s_redis_instance'$objectManagerName)))]);
  501.                 break;
  502.             case 'apcu':
  503.                 $cacheDef = new Definition(ApcuAdapter::class);
  504.                 break;
  505.             case 'array':
  506.                 $cacheDef = new Definition(ArrayAdapter::class);
  507.                 break;
  508.             default:
  509.                 return parent::loadCacheDriver($cacheName$objectManagerName$cacheDriver$container);
  510.         }
  511.         $cacheDef->setPublic(false);
  512.         $container->setDefinition($cacheDriverServiceId$cacheDef);
  513.         return $cacheDriverServiceId;
  514.     }
  515.     private function buildDeprecationArgs(string $versionstring $message): array
  516.     {
  517.         // @todo Remove when support for Symfony 5.1 and older is dropped
  518.         return method_exists(BaseNode::class, 'getDeprecation')
  519.             ? ['doctrine/mongodb-odm-bundle'$version$message]
  520.             : [$message];
  521.     }
  522.     private static function getODMVersion(): string
  523.     {
  524.         if (self::$odmVersion === null) {
  525.             try {
  526.                 self::$odmVersion PrettyVersions::getVersion('doctrine/mongodb-odm')->getPrettyVersion();
  527.             } catch (Throwable $t) {
  528.                 return 'unknown';
  529.             }
  530.         }
  531.         return self::$odmVersion;
  532.     }
  533. }