vendor/doctrine/orm/src/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. * @phpstan-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. * @phpstan-param int-mask-of<self::INVOKE_*> $invoke
  63. *
  64. * @return void
  65. */
  66. public function invoke(ClassMetadata $metadata, $eventName, $entity, EventArgs $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. }