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

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.     /**
  27.      * Initializes a new ListenersInvoker instance.
  28.      */
  29.     public function __construct(EntityManagerInterface $em)
  30.     {
  31.         $this->eventManager $em->getEventManager();
  32.         $this->resolver     $em->getConfiguration()->getEntityListenerResolver();
  33.     }
  34.     /**
  35.      * Get the subscribed event systems
  36.      *
  37.      * @param ClassMetadata $metadata  The entity metadata.
  38.      * @param string        $eventName The entity lifecycle event.
  39.      *
  40.      * @return int Bitmask of subscribed event systems.
  41.      */
  42.     public function getSubscribedSystems(ClassMetadata $metadata$eventName)
  43.     {
  44.         $invoke self::INVOKE_NONE;
  45.         if (isset($metadata->lifecycleCallbacks[$eventName])) {
  46.             $invoke |= self::INVOKE_CALLBACKS;
  47.         }
  48.         if (isset($metadata->entityListeners[$eventName])) {
  49.             $invoke |= self::INVOKE_LISTENERS;
  50.         }
  51.         if ($this->eventManager->hasListeners($eventName)) {
  52.             $invoke |= self::INVOKE_MANAGER;
  53.         }
  54.         return $invoke;
  55.     }
  56.     /**
  57.      * Dispatches the lifecycle event of the given entity.
  58.      *
  59.      * @param ClassMetadata $metadata  The entity metadata.
  60.      * @param string        $eventName The entity lifecycle event.
  61.      * @param object        $entity    The Entity on which the event occurred.
  62.      * @param EventArgs     $event     The Event args.
  63.      * @param int           $invoke    Bitmask to invoke listeners.
  64.      *
  65.      * @return void
  66.      */
  67.     public function invoke(ClassMetadata $metadata$eventName$entityEventArgs $event$invoke)
  68.     {
  69.         if ($invoke self::INVOKE_CALLBACKS) {
  70.             foreach ($metadata->lifecycleCallbacks[$eventName] as $callback) {
  71.                 $entity->$callback($event);
  72.             }
  73.         }
  74.         if ($invoke self::INVOKE_LISTENERS) {
  75.             foreach ($metadata->entityListeners[$eventName] as $listener) {
  76.                 $class    $listener['class'];
  77.                 $method   $listener['method'];
  78.                 $instance $this->resolver->resolve($class);
  79.                 $instance->$method($entity$event);
  80.             }
  81.         }
  82.         if ($invoke self::INVOKE_MANAGER) {
  83.             $this->eventManager->dispatchEvent($eventName$event);
  84.         }
  85.     }
  86. }