vendor/sulu/sulu/src/Sulu/Bundle/PersistenceBundle/DependencyInjection/PersistenceExtensionTrait.php line 93

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of Sulu.
  4.  *
  5.  * (c) Sulu GmbH
  6.  *
  7.  * This source file is subject to the MIT license that is bundled
  8.  * with this source code in the file LICENSE.
  9.  */
  10. namespace Sulu\Bundle\PersistenceBundle\DependencyInjection;
  11. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepositoryInterface;
  12. use Symfony\Component\DependencyInjection\ContainerBuilder;
  13. use Symfony\Component\DependencyInjection\Definition;
  14. use Symfony\Component\DependencyInjection\Reference;
  15. /**
  16.  * Define repository services for each object (e.g. sulu.repository.[object name]) and
  17.  * map all object parameters to the container.
  18.  */
  19. trait PersistenceExtensionTrait
  20. {
  21.     /**
  22.      * @param array<string, array{model: class-string, repository?: class-string}> $objects
  23.      *
  24.      * @return void
  25.      */
  26.     protected function configurePersistence(array $objectsContainerBuilder $container)
  27.     {
  28.         $this->defineRepositories($objects$container);
  29.         $this->remapObjectParameters($objects$container);
  30.         $configObjects = ['sulu' => $objects];
  31.         if ($container->hasParameter('sulu.persistence.objects')) {
  32.             /** @var mixed[] $existingConfigObjects */
  33.             $existingConfigObjects $container->getParameter('sulu.persistence.objects');
  34.             $configObjects \array_merge_recursive($configObjects$existingConfigObjects);
  35.         }
  36.         $container->setParameter('sulu.persistence.objects'$configObjects);
  37.     }
  38.     /**
  39.      * @param array<string, array{model: class-string, repository?: class-string}> $objects
  40.      */
  41.     private function defineRepositories(array $objectsContainerBuilder $container): void
  42.     {
  43.         foreach ($objects as $object => $services) {
  44.             if (\array_key_exists('model'$services)) {
  45.                 $repositoryDefinition $this->getRepositoryDefinition($object$services$container);
  46.                 $container->setDefinition($this->getContainerKey('repository'$object), $repositoryDefinition)
  47.                     ->setPublic(true)
  48.                     ->setLazy(true);
  49.             }
  50.         }
  51.     }
  52.     /**
  53.      * Get the repository service definition.
  54.      *
  55.      * @param string $object
  56.      * @param array{model: class-string, repository?: class-string} $services
  57.      *
  58.      * @return Definition
  59.      */
  60.     private function getRepositoryDefinition($object, array $servicesContainerBuilder $container)
  61.     {
  62.         $repositoryKey $this->getContainerKey('repository'$object'.class');
  63.         // default repository
  64.         $repositoryClass 'Sulu\Component\Persistence\Repository\ORM\EntityRepository';
  65.         if ($container->hasParameter($repositoryKey)) {
  66.             /** @var class-string $repositoryClass */
  67.             $repositoryClass $container->getParameter($repositoryKey);
  68.         }
  69.         if (isset($services['repository'])) {
  70.             $repositoryClass $services['repository'];
  71.         }
  72.         $definition = new Definition($repositoryClass);
  73.         $definition->setArguments([
  74.             new Reference($this->getEntityManagerServiceKey()),
  75.             $this->getClassMetadataDefinition($services['model']),
  76.         ]);
  77.         $repositoryReflectionClass = new \ReflectionClass($repositoryClass);
  78.         if (
  79.             $repositoryReflectionClass->hasMethod('setAccessControlQueryEnhancer')
  80.             && !$repositoryReflectionClass->implementsInterface(ServiceEntityRepositoryInterface::class)
  81.         ) {
  82.             $definition->addMethodCall(
  83.                 'setAccessControlQueryEnhancer',
  84.                 [new Reference('sulu_security.access_control_query_enhancer')]
  85.             );
  86.         }
  87.         return $definition;
  88.     }
  89.     /**
  90.      * @param class-string $model
  91.      *
  92.      * @return Definition
  93.      */
  94.     private function getClassMetadataDefinition($model)
  95.     {
  96.         $definition = new Definition('Doctrine\ORM\Mapping\ClassMetadata');
  97.         $definition
  98.             ->setFactory([
  99.                 new Reference($this->getEntityManagerServiceKey()),
  100.                 'getClassMetadata',
  101.             ])
  102.             ->setArguments([$model])
  103.             ->setPublic(false);
  104.         return $definition;
  105.     }
  106.     /**
  107.      * @param array<string, array{model: class-string, repository?: class-string}> $objects
  108.      */
  109.     private function remapObjectParameters(array $objectsContainerBuilder $container): void
  110.     {
  111.         foreach ($objects as $object => $services) {
  112.             foreach ($services as $service => $class) {
  113.                 $container->setParameter(
  114.                     \sprintf(
  115.                         'sulu.%s.%s.class',
  116.                         $service,
  117.                         $object
  118.                     ),
  119.                     $class
  120.                 );
  121.             }
  122.         }
  123.     }
  124.     /**
  125.      * Get container key.
  126.      *
  127.      * @param string $key
  128.      * @param string $object
  129.      * @param string|null $suffix
  130.      *
  131.      * @return string
  132.      */
  133.     private function getContainerKey($key$object$suffix null)
  134.     {
  135.         return \sprintf('sulu.%s.%s%s'$key$object$suffix);
  136.     }
  137.     /**
  138.      * Get the entity manager.
  139.      *
  140.      * @return string
  141.      */
  142.     private function getEntityManagerServiceKey()
  143.     {
  144.         return 'doctrine.orm.default_entity_manager';
  145.     }
  146. }