vendor/api-platform/core/src/Bridge/Doctrine/Common/DataPersister.php line 50

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the API Platform project.
  4.  *
  5.  * (c) Kévin Dunglas <dunglas@gmail.com>
  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 ApiPlatform\Core\Bridge\Doctrine\Common;
  12. use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface;
  13. use ApiPlatform\Core\Util\ClassInfoTrait;
  14. use Doctrine\ODM\MongoDB\Mapping\ClassMetadata;
  15. use Doctrine\ORM\Mapping\ClassMetadataInfo;
  16. use Doctrine\Persistence\ManagerRegistry;
  17. use Doctrine\Persistence\ObjectManager as DoctrineObjectManager;
  18. /**
  19.  * Data persister for Doctrine.
  20.  *
  21.  * @author Baptiste Meyer <baptiste.meyer@gmail.com>
  22.  */
  23. final class DataPersister implements ContextAwareDataPersisterInterface
  24. {
  25.     use ClassInfoTrait;
  26.     private $managerRegistry;
  27.     public function __construct(ManagerRegistry $managerRegistry)
  28.     {
  29.         $this->managerRegistry $managerRegistry;
  30.     }
  31.     /**
  32.      * {@inheritdoc}
  33.      */
  34.     public function supports($data, array $context = []): bool
  35.     {
  36.         return null !== $this->getManager($data);
  37.     }
  38.     /**
  39.      * {@inheritdoc}
  40.      */
  41.     public function persist($data, array $context = [])
  42.     {
  43.         if (!$manager $this->getManager($data)) {
  44.             return $data;
  45.         }
  46.         if (!$manager->contains($data) || $this->isDeferredExplicit($manager$data)) {
  47.             $manager->persist($data);
  48.         }
  49.         $manager->flush();
  50.         $manager->refresh($data);
  51.         return $data;
  52.     }
  53.     /**
  54.      * {@inheritdoc}
  55.      */
  56.     public function remove($data, array $context = [])
  57.     {
  58.         if (!$manager $this->getManager($data)) {
  59.             return;
  60.         }
  61.         $manager->remove($data);
  62.         $manager->flush();
  63.     }
  64.     /**
  65.      * Gets the Doctrine object manager associated with given data.
  66.      */
  67.     private function getManager($data): ?DoctrineObjectManager
  68.     {
  69.         return \is_object($data) ? $this->managerRegistry->getManagerForClass($this->getObjectClass($data)) : null;
  70.     }
  71.     /**
  72.      * Checks if doctrine does not manage data automatically.
  73.      */
  74.     private function isDeferredExplicit(DoctrineObjectManager $manager$data): bool
  75.     {
  76.         $classMetadata $manager->getClassMetadata($this->getObjectClass($data));
  77.         if (($classMetadata instanceof ClassMetadataInfo || $classMetadata instanceof ClassMetadata) && method_exists($classMetadata'isChangeTrackingDeferredExplicit')) {
  78.             return $classMetadata->isChangeTrackingDeferredExplicit();
  79.         }
  80.         return false;
  81.     }
  82. }