vendor/sylius/resource-bundle/src/Bundle/DependencyInjection/Driver/Doctrine/DoctrineORMDriver.php line 71

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Sylius package.
  4.  *
  5.  * (c) Paweł Jędrzejewski
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace Sylius\Bundle\ResourceBundle\DependencyInjection\Driver\Doctrine;
  12. use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\ServiceRepositoryCompilerPass;
  13. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  14. use Doctrine\Common\Persistence\ObjectManager as DeprecatedObjectManager;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Doctrine\ORM\Mapping\ClassMetadata;
  17. use Doctrine\Persistence\ObjectManager;
  18. use Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository;
  19. use Sylius\Bundle\ResourceBundle\SyliusResourceBundle;
  20. use Sylius\Component\Resource\Metadata\MetadataInterface;
  21. use Symfony\Component\DependencyInjection\ContainerBuilder;
  22. use Symfony\Component\DependencyInjection\Definition;
  23. use Symfony\Component\DependencyInjection\Reference;
  24. final class DoctrineORMDriver extends AbstractDoctrineDriver
  25. {
  26.     public const GENERIC_ENTITIES_PARAMETER 'sylius.doctrine.orm.container_repository_factory.entities';
  27.     public function getType(): string
  28.     {
  29.         return SyliusResourceBundle::DRIVER_DOCTRINE_ORM;
  30.     }
  31.     protected function addRepository(ContainerBuilder $containerMetadataInterface $metadata): void
  32.     {
  33.         $repositoryClassParameterName sprintf('%s.repository.%s.class'$metadata->getApplicationName(), $metadata->getName());
  34.         $repositoryClass EntityRepository::class;
  35.         /** @var string[] $genericEntities */
  36.         $genericEntities $container->hasParameter(self::GENERIC_ENTITIES_PARAMETER) ? $container->getParameter(self::GENERIC_ENTITIES_PARAMETER) : [];
  37.         if ($container->hasParameter($repositoryClassParameterName)) {
  38.             /** @var string $repositoryClass */
  39.             $repositoryClass $container->getParameter($repositoryClassParameterName);
  40.         }
  41.         if ($metadata->hasClass('repository')) {
  42.             /** @var string $repositoryClass */
  43.             $repositoryClass $metadata->getClass('repository');
  44.         }
  45.         $serviceId $metadata->getServiceId('repository');
  46.         $managerReference = new Reference($metadata->getServiceId('manager'));
  47.         $definition = new Definition($repositoryClass);
  48.         $definition->setPublic(true);
  49.         if ($repositoryClass === EntityRepository::class) {
  50.             /** @var string $entityClass */
  51.             $entityClass $metadata->getClass('model');
  52.             $definition->setFactory([$managerReference'getRepository']);
  53.             $definition->setArguments([$entityClass]);
  54.             $container->setDefinition($serviceId$definition);
  55.             $genericEntities[] = $entityClass;
  56.         } else {
  57.             if (is_a($repositoryClassServiceEntityRepository::class, true)) {
  58.                 $definition->setArguments([new Reference('doctrine')]);
  59.                 $container->setDefinition($serviceId$definition);
  60.             } else {
  61.                 $definition->setArguments([$managerReference$this->getClassMetadataDefinition($metadata)]);
  62.             }
  63.             $container->setDefinition($serviceId$definition);
  64.             $doctrineDefinition = new Definition($repositoryClass);
  65.             $doctrineDefinition->addTag(ServiceRepositoryCompilerPass::REPOSITORY_SERVICE_TAG);
  66.             $doctrineDefinition->setFactory([new Reference('service_container'), 'get']);
  67.             $doctrineDefinition->setArguments([$serviceId]);
  68.             $container->setDefinition($repositoryClass$doctrineDefinition);
  69.         }
  70.         /** @var array $repositoryInterfaces */
  71.         $repositoryInterfaces class_implements($repositoryClass);
  72.         /** @var array $repositoryParents */
  73.         $repositoryParents class_parents($repositoryClass);
  74.         $typehintClasses array_merge(
  75.             $repositoryInterfaces,
  76.             [$repositoryClass],
  77.             $repositoryParents,
  78.         );
  79.         foreach ($typehintClasses as $typehintClass) {
  80.             $container->registerAliasForArgument(
  81.                 $metadata->getServiceId('repository'),
  82.                 $typehintClass,
  83.                 $metadata->getHumanizedName() . ' repository',
  84.             );
  85.         }
  86.         $container->setParameter(self::GENERIC_ENTITIES_PARAMETER$genericEntities);
  87.     }
  88.     protected function addManager(ContainerBuilder $containerMetadataInterface $metadata): void
  89.     {
  90.         parent::addManager($container$metadata);
  91.         $typehintClasses = [
  92.             DeprecatedObjectManager::class,
  93.             ObjectManager::class,
  94.             EntityManagerInterface::class,
  95.         ];
  96.         foreach ($typehintClasses as $typehintClass) {
  97.             $container->registerAliasForArgument(
  98.                 $metadata->getServiceId('manager'),
  99.                 $typehintClass,
  100.                 $metadata->getHumanizedName() . ' manager',
  101.             );
  102.         }
  103.     }
  104.     protected function getManagerServiceId(MetadataInterface $metadata): string
  105.     {
  106.         if ($objectManagerName $this->getObjectManagerName($metadata)) {
  107.             return sprintf('doctrine.orm.%s_entity_manager'$objectManagerName);
  108.         }
  109.         return 'doctrine.orm.entity_manager';
  110.     }
  111.     protected function getClassMetadataClassname(): string
  112.     {
  113.         return ClassMetadata::class;
  114.     }
  115. }