vendor/doctrine/orm/lib/Doctrine/ORM/Event/ListenersInvoker.php line 79

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Doctrine\ORM\Event;
  4. use Doctrine\Common\EventArgs;
  5. use Doctrine\Common\EventManager;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Doctrine\ORM\Mapping\ClassMetadata;
  8. use Doctrine\ORM\Mapping\EntityListenerResolver;
  9. /**
  10.  * A method invoker based on entity lifecycle.
  11.  */
  12. class ListenersInvoker
  13. {
  14.     public const INVOKE_NONE      0;
  15.     public const INVOKE_LISTENERS 1;
  16.     public const INVOKE_CALLBACKS 2;
  17.     public const INVOKE_MANAGER   4;
  18.     /** @var EntityListenerResolver The Entity listener resolver. */
  19.     private $resolver;
  20.     /**
  21.      * The EventManager used for dispatching events.
  22.      *
  23.      * @var EventManager
  24.      */
  25.     private $eventManager;
  26.     public function __construct(EntityManagerInterface $em)
  27.     {
  28.         $this->eventManager $em->getEventManager();
  29.         $this->resolver     $em->getConfiguration()->getEntityListenerResolver();
  30.     }
  31.     /**
  32.      * Get the subscribed event systems
  33.      *
  34.      * @param ClassMetadata $metadata  The entity metadata.
  35.      * @param string        $eventName The entity lifecycle event.
  36.      *
  37.      * @return int Bitmask of subscribed event systems.
  38.      * @psalm-return int-mask-of<self::INVOKE_*>
  39.      */
  40.     public function getSubscribedSystems(ClassMetadata $metadata$eventName)
  41.     {
  42.         $invoke self::INVOKE_NONE;
  43.         if (isset($metadata->lifecycleCallbacks[$eventName])) {
  44.             $invoke |= self::INVOKE_CALLBACKS;
  45.         }
  46.         if (isset($metadata->entityListeners[$eventName])) {
  47.             $invoke |= self::INVOKE_LISTENERS;
  48.         }
  49.         if ($this->eventManager->hasListeners($eventName)) {
  50.             $invoke |= self::INVOKE_MANAGER;
  51.         }
  52.         return $invoke;
  53.     }
  54.     /**
  55.      * Dispatches the lifecycle event of the given entity.
  56.      *
  57.      * @param ClassMetadata $metadata  The entity metadata.
  58.      * @param string        $eventName The entity lifecycle event.
  59.      * @param object        $entity    The Entity on which the event occurred.
  60.      * @param EventArgs     $event     The Event args.
  61.      * @param int           $invoke    Bitmask to invoke listeners.
  62.      * @psalm-param int-mask-of<self::INVOKE_*> $invoke
  63.      *
  64.      * @return void
  65.      */
  66.     public function invoke(ClassMetadata $metadata$eventName$entityEventArgs $event$invoke)
  67.     {
  68.         if ($invoke self::INVOKE_CALLBACKS) {
  69.             foreach ($metadata->lifecycleCallbacks[$eventName] as $callback) {
  70.                 $entity->$callback($event);
  71.             }
  72.         }
  73.         if ($invoke self::INVOKE_LISTENERS) {
  74.             foreach ($metadata->entityListeners[$eventName] as $listener) {
  75.                 $class    $listener['class'];
  76.                 $method   $listener['method'];
  77.                 $instance $this->resolver->resolve($class);
  78.                 $instance->$method($entity$event);
  79.             }
  80.         }
  81.         if ($invoke self::INVOKE_MANAGER) {
  82.             $this->eventManager->dispatchEvent($eventName$event);
  83.         }
  84.     }
  85. }