src/Component/Doctrine/EntityPersister/EntityPersister.php line 27

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Component\Doctrine\EntityPersister;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
  6. use Symfony\Component\HttpKernel\Event\TerminateEvent;
  7. /**
  8.  * We use this class to be able to persist objects in an onFlush or postFlush event. They will only be actually
  9.  * persisted when the kernel is shutting down. This way we can prevent nested flushing.
  10.  */
  11. #[AsEventListener]
  12. class EntityPersister
  13. {
  14.     /**
  15.      * @var array<int, object>
  16.      */
  17.     private array $queue = [];
  18.     public function __construct(private readonly EntityManagerInterface $em)
  19.     {
  20.     }
  21.     public function __invoke(TerminateEvent $event): void
  22.     {
  23.         if (empty($this->queue)) {
  24.             return;
  25.         }
  26.         foreach ($this->queue as $id => $object) {
  27.             unset($this->queue[$id]);
  28.             $this->em->persist($object);
  29.         }
  30.         $this->em->flush();
  31.     }
  32.     public function persist(object ...$entity): void
  33.     {
  34.         foreach ($entity as $object) {
  35.             $id spl_object_id($object);
  36.             $this->queue[$id] = $object;
  37.         }
  38.     }
  39. }