1<?php 2 3namespace Doctrine\Common; 4 5use function spl_object_hash; 6 7/** 8 * The EventManager is the central point of Doctrine's event listener system. 9 * Listeners are registered on the manager and events are dispatched through the 10 * manager. 11 */ 12class EventManager 13{ 14 /** 15 * Map of registered listeners. 16 * <event> => <listeners> 17 * 18 * @var object[][] 19 */ 20 private $_listeners = []; 21 22 /** 23 * Dispatches an event to all registered listeners. 24 * 25 * @param string $eventName The name of the event to dispatch. The name of the event is 26 * the name of the method that is invoked on listeners. 27 * @param EventArgs|null $eventArgs The event arguments to pass to the event handlers/listeners. 28 * If not supplied, the single empty EventArgs instance is used. 29 * 30 * @return void 31 */ 32 public function dispatchEvent($eventName, ?EventArgs $eventArgs = null) 33 { 34 if (! isset($this->_listeners[$eventName])) { 35 return; 36 } 37 38 $eventArgs = $eventArgs ?? EventArgs::getEmptyInstance(); 39 40 foreach ($this->_listeners[$eventName] as $listener) { 41 $listener->$eventName($eventArgs); 42 } 43 } 44 45 /** 46 * Gets the listeners of a specific event or all listeners. 47 * 48 * @param string|null $event The name of the event. 49 * 50 * @return object[]|object[][] The event listeners for the specified event, or all event listeners. 51 */ 52 public function getListeners($event = null) 53 { 54 return $event ? $this->_listeners[$event] : $this->_listeners; 55 } 56 57 /** 58 * Checks whether an event has any registered listeners. 59 * 60 * @param string $event 61 * 62 * @return bool TRUE if the specified event has any listeners, FALSE otherwise. 63 */ 64 public function hasListeners($event) 65 { 66 return ! empty($this->_listeners[$event]); 67 } 68 69 /** 70 * Adds an event listener that listens on the specified events. 71 * 72 * @param string|string[] $events The event(s) to listen on. 73 * @param object $listener The listener object. 74 * 75 * @return void 76 */ 77 public function addEventListener($events, $listener) 78 { 79 // Picks the hash code related to that listener 80 $hash = spl_object_hash($listener); 81 82 foreach ((array) $events as $event) { 83 // Overrides listener if a previous one was associated already 84 // Prevents duplicate listeners on same event (same instance only) 85 $this->_listeners[$event][$hash] = $listener; 86 } 87 } 88 89 /** 90 * Removes an event listener from the specified events. 91 * 92 * @param string|string[] $events 93 * @param object $listener 94 * 95 * @return void 96 */ 97 public function removeEventListener($events, $listener) 98 { 99 // Picks the hash code related to that listener 100 $hash = spl_object_hash($listener); 101 102 foreach ((array) $events as $event) { 103 unset($this->_listeners[$event][$hash]); 104 } 105 } 106 107 /** 108 * Adds an EventSubscriber. The subscriber is asked for all the events it is 109 * interested in and added as a listener for these events. 110 * 111 * @param EventSubscriber $subscriber The subscriber. 112 * 113 * @return void 114 */ 115 public function addEventSubscriber(EventSubscriber $subscriber) 116 { 117 $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber); 118 } 119 120 /** 121 * Removes an EventSubscriber. The subscriber is asked for all the events it is 122 * interested in and removed as a listener for these events. 123 * 124 * @param EventSubscriber $subscriber The subscriber. 125 * 126 * @return void 127 */ 128 public function removeEventSubscriber(EventSubscriber $subscriber) 129 { 130 $this->removeEventListener($subscriber->getSubscribedEvents(), $subscriber); 131 } 132} 133