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, $entity, EventArgs $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. }