vendor/doctrine/doctrine-bundle/DependencyInjection/Compiler/CacheCompatibilityPass.php line 110

Open in your IDE?
  1. <?php
  2. namespace Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler;
  3. use Doctrine\Common\Cache\CacheProvider;
  4. use Doctrine\Common\Cache\Psr6\CacheAdapter;
  5. use Doctrine\Common\Cache\Psr6\DoctrineProvider;
  6. use Psr\Cache\CacheItemPoolInterface;
  7. use Symfony\Component\DependencyInjection\ChildDefinition;
  8. use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
  9. use Symfony\Component\DependencyInjection\ContainerBuilder;
  10. use Symfony\Component\DependencyInjection\Definition;
  11. use Symfony\Component\DependencyInjection\Reference;
  12. use function array_keys;
  13. use function assert;
  14. use function is_a;
  15. use function trigger_deprecation;
  16. /** @internal  */
  17. final class CacheCompatibilityPass implements CompilerPassInterface
  18. {
  19.     private const CONFIGURATION_TAG              'doctrine.orm.configuration';
  20.     private const CACHE_METHODS_PSR6_SUPPORT_MAP = [
  21.         'setMetadataCache' => true,
  22.         'setQueryCacheImpl' => false,
  23.         'setResultCacheImpl' => false,
  24.     ];
  25.     public function process(ContainerBuilder $container): void
  26.     {
  27.         foreach (array_keys($container->findTaggedServiceIds(self::CONFIGURATION_TAG)) as $id) {
  28.             foreach ($container->getDefinition($id)->getMethodCalls() as $methodCall) {
  29.                 if ($methodCall[0] === 'setSecondLevelCacheConfiguration') {
  30.                     $this->updateSecondLevelCache($container$methodCall[1][0]);
  31.                     continue;
  32.                 }
  33.                 if (! isset(self::CACHE_METHODS_PSR6_SUPPORT_MAP[$methodCall[0]])) {
  34.                     continue;
  35.                 }
  36.                 $aliasId      = (string) $methodCall[1][0];
  37.                 $definitionId = (string) $container->getAlias($aliasId);
  38.                 $shouldBePsr6 self::CACHE_METHODS_PSR6_SUPPORT_MAP[$methodCall[0]];
  39.                 $this->wrapIfNecessary($container$aliasId$definitionId$shouldBePsr6);
  40.             }
  41.         }
  42.     }
  43.     private function updateSecondLevelCache(ContainerBuilder $containerDefinition $slcConfigDefinition): void
  44.     {
  45.         foreach ($slcConfigDefinition->getMethodCalls() as $methodCall) {
  46.             if ($methodCall[0] !== 'setCacheFactory') {
  47.                 continue;
  48.             }
  49.             $factoryDefinition $methodCall[1][0];
  50.             assert($factoryDefinition instanceof Definition);
  51.             $aliasId = (string) $factoryDefinition->getArgument(1);
  52.             $this->wrapIfNecessary($container$aliasId, (string) $container->getAlias($aliasId), false);
  53.             foreach ($factoryDefinition->getMethodCalls() as $factoryMethodCall) {
  54.                 if ($factoryMethodCall[0] !== 'setRegion') {
  55.                     continue;
  56.                 }
  57.                 $regionDefinition $container->getDefinition($factoryMethodCall[1][0]);
  58.                 // We don't know how to adjust custom region classes
  59.                 if ($regionDefinition->getClass() !== '%doctrine.orm.second_level_cache.default_region.class%') {
  60.                     continue;
  61.                 }
  62.                 $driverId = (string) $regionDefinition->getArgument(1);
  63.                 if (! $container->hasAlias($driverId)) {
  64.                     continue;
  65.                 }
  66.                 $this->wrapIfNecessary($container$driverId, (string) $container->getAlias($driverId), false);
  67.             }
  68.             break;
  69.         }
  70.     }
  71.     private function createCompatibilityLayerDefinition(ContainerBuilder $containerstring $definitionIdbool $shouldBePsr6): ?Definition
  72.     {
  73.         $definition $container->getDefinition($definitionId);
  74.         while (! $definition->getClass() && $definition instanceof ChildDefinition) {
  75.             $definition $container->findDefinition($definition->getParent());
  76.         }
  77.         if ($shouldBePsr6 === is_a($definition->getClass(), CacheItemPoolInterface::class, true)) {
  78.             return null;
  79.         }
  80.         $targetClass   CacheProvider::class;
  81.         $targetFactory DoctrineProvider::class;
  82.         if ($shouldBePsr6) {
  83.             $targetClass   CacheItemPoolInterface::class;
  84.             $targetFactory CacheAdapter::class;
  85.             trigger_deprecation(
  86.                 'doctrine/doctrine-bundle',
  87.                 '2.4',
  88.                 'Configuring doctrine/cache is deprecated. Please update the cache service "%s" to use a PSR-6 cache.',
  89.                 $definitionId
  90.             );
  91.         }
  92.         return (new Definition($targetClass))
  93.             ->setFactory([$targetFactory'wrap'])
  94.             ->addArgument(new Reference($definitionId));
  95.     }
  96.     private function wrapIfNecessary(ContainerBuilder $containerstring $aliasIdstring $definitionIdbool $shouldBePsr6): void
  97.     {
  98.         $compatibilityLayer $this->createCompatibilityLayerDefinition($container$definitionId$shouldBePsr6);
  99.         if ($compatibilityLayer === null) {
  100.             return;
  101.         }
  102.         $compatibilityLayerId $definitionId '.compatibility_layer';
  103.         $container->setAlias($aliasId$compatibilityLayerId);
  104.         $container->setDefinition($compatibilityLayerId$compatibilityLayer);
  105.     }
  106. }