vendor/sylius/resource-bundle/src/Bundle/EventListener/ORMMappedSuperClassSubscriber.php line 58

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\EventListener;
  12. use Doctrine\ORM\Configuration;
  13. use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
  14. use Doctrine\ORM\Events;
  15. use Doctrine\ORM\Mapping\ClassMetadata;
  16. use Doctrine\ORM\Mapping\ClassMetadataInfo;
  17. use Doctrine\Persistence\Mapping\Driver\MappingDriver;
  18. use Webmozart\Assert\Assert;
  19. final class ORMMappedSuperClassSubscriber extends AbstractDoctrineSubscriber
  20. {
  21.     public function getSubscribedEvents(): array
  22.     {
  23.         return [
  24.             Events::loadClassMetadata,
  25.         ];
  26.     }
  27.     public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void
  28.     {
  29.         $metadata $eventArgs->getClassMetadata();
  30.         if (!$metadata->isMappedSuperclass) {
  31.             $this->setAssociationMappings($metadata$eventArgs->getEntityManager()->getConfiguration());
  32.         } else {
  33.             $this->unsetAssociationMappings($metadata);
  34.         }
  35.     }
  36.     private function setAssociationMappings(ClassMetadataInfo $metadataConfiguration $configuration): void
  37.     {
  38.         $class $metadata->getName();
  39.         if (!class_exists($class)) {
  40.             return;
  41.         }
  42.         /** @psalm-suppress DeprecatedClass */
  43.         $metadataDriver $configuration->getMetadataDriverImpl();
  44.         Assert::isInstanceOf($metadataDriverMappingDriver::class);
  45.         $parents class_parents($class) ?: [];
  46.         foreach ($parents as $parent) {
  47.             if (false === in_array($parent$metadataDriver->getAllClassNames(), true)) {
  48.                 continue;
  49.             }
  50.             $parentMetadata = new ClassMetadata(
  51.                 $parent,
  52.                 $configuration->getNamingStrategy()
  53.             );
  54.             // Wakeup Reflection
  55.             /** @psalm-suppress ArgumentTypeCoercion */
  56.             $parentMetadata->wakeupReflection($this->getReflectionService());
  57.             // Load Metadata
  58.             $metadataDriver->loadMetadataForClass($parent$parentMetadata);
  59.             /** @psalm-suppress InvalidArgument */
  60.             if (false === $this->isResource($parentMetadata)) {
  61.                 continue;
  62.             }
  63.             if ($parentMetadata->isMappedSuperclass) {
  64.                 foreach ($parentMetadata->getAssociationMappings() as $key => $value) {
  65.                     if ($this->isRelation($value['type']) && !isset($metadata->associationMappings[$key])) {
  66.                         $metadata->associationMappings[$key] = $value;
  67.                     }
  68.                 }
  69.             }
  70.         }
  71.     }
  72.     private function unsetAssociationMappings(ClassMetadataInfo $metadata): void
  73.     {
  74.         /** @psalm-suppress InvalidArgument */
  75.         if (false === $this->isResource($metadata)) {
  76.             return;
  77.         }
  78.         foreach ($metadata->getAssociationMappings() as $key => $value) {
  79.             if ($this->isRelation($value['type'])) {
  80.                 unset($metadata->associationMappings[$key]);
  81.             }
  82.         }
  83.     }
  84.     private function isRelation(int $type): bool
  85.     {
  86.         return in_array(
  87.             $type,
  88.             [
  89.                 ClassMetadataInfo::MANY_TO_MANY,
  90.                 ClassMetadataInfo::ONE_TO_MANY,
  91.                 ClassMetadataInfo::ONE_TO_ONE,
  92.             ],
  93.             true
  94.         );
  95.     }
  96. }