2015-08-17 17:00:26 -07:00
< ? php
namespace Doctrine\Common ;
2018-11-23 12:29:20 +00:00
use function spl_object_hash ;
2015-08-17 17:00:26 -07:00
/**
* The EventManager is the central point of Doctrine ' s event listener system .
* Listeners are registered on the manager and events are dispatched through the
* manager .
*/
class EventManager
{
/**
* Map of registered listeners .
* < event > => < listeners >
*
2018-11-23 12:29:20 +00:00
* @ var object [][]
2015-08-17 17:00:26 -07:00
*/
2017-04-13 15:53:35 +01:00
private $_listeners = [];
2015-08-17 17:00:26 -07:00
/**
* Dispatches an event to all registered listeners .
*
2018-11-23 12:29:20 +00:00
* @ param string $eventName The name of the event to dispatch . The name of the event is
2015-08-17 17:00:26 -07:00
* the name of the method that is invoked on listeners .
* @ param EventArgs | null $eventArgs The event arguments to pass to the event handlers / listeners .
* If not supplied , the single empty EventArgs instance is used .
*
2018-11-23 12:29:20 +00:00
* @ return void
2015-08-17 17:00:26 -07:00
*/
2018-11-23 12:29:20 +00:00
public function dispatchEvent ( $eventName , ? EventArgs $eventArgs = null )
2015-08-17 17:00:26 -07:00
{
2018-11-23 12:29:20 +00:00
if ( ! isset ( $this -> _listeners [ $eventName ])) {
return ;
}
$eventArgs = $eventArgs ? ? EventArgs :: getEmptyInstance ();
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
foreach ( $this -> _listeners [ $eventName ] as $listener ) {
$listener -> $eventName ( $eventArgs );
2015-08-17 17:00:26 -07:00
}
}
/**
* Gets the listeners of a specific event or all listeners .
*
* @ param string | null $event The name of the event .
*
2018-11-23 12:29:20 +00:00
* @ return object [] | object [][] The event listeners for the specified event , or all event listeners .
2015-08-17 17:00:26 -07:00
*/
public function getListeners ( $event = null )
{
return $event ? $this -> _listeners [ $event ] : $this -> _listeners ;
}
/**
* Checks whether an event has any registered listeners .
*
* @ param string $event
*
2018-11-23 12:29:20 +00:00
* @ return bool TRUE if the specified event has any listeners , FALSE otherwise .
2015-08-17 17:00:26 -07:00
*/
public function hasListeners ( $event )
{
2018-11-23 12:29:20 +00:00
return ! empty ( $this -> _listeners [ $event ]);
2015-08-17 17:00:26 -07:00
}
/**
* Adds an event listener that listens on the specified events .
*
2018-11-23 12:29:20 +00:00
* @ param string | string [] $events The event ( s ) to listen on .
* @ param object $listener The listener object .
2015-08-17 17:00:26 -07:00
*
* @ return void
*/
public function addEventListener ( $events , $listener )
{
// Picks the hash code related to that listener
$hash = spl_object_hash ( $listener );
foreach (( array ) $events as $event ) {
// Overrides listener if a previous one was associated already
// Prevents duplicate listeners on same event (same instance only)
$this -> _listeners [ $event ][ $hash ] = $listener ;
}
}
/**
* Removes an event listener from the specified events .
*
2018-11-23 12:29:20 +00:00
* @ param string | string [] $events
* @ param object $listener
2015-08-17 17:00:26 -07:00
*
* @ return void
*/
public function removeEventListener ( $events , $listener )
{
// Picks the hash code related to that listener
$hash = spl_object_hash ( $listener );
foreach (( array ) $events as $event ) {
2018-11-23 12:29:20 +00:00
unset ( $this -> _listeners [ $event ][ $hash ]);
2015-08-17 17:00:26 -07:00
}
}
/**
* Adds an EventSubscriber . The subscriber is asked for all the events it is
* interested in and added as a listener for these events .
*
2018-11-23 12:29:20 +00:00
* @ param EventSubscriber $subscriber The subscriber .
2015-08-17 17:00:26 -07:00
*
* @ return void
*/
public function addEventSubscriber ( EventSubscriber $subscriber )
{
$this -> addEventListener ( $subscriber -> getSubscribedEvents (), $subscriber );
}
/**
* Removes an EventSubscriber . The subscriber is asked for all the events it is
* interested in and removed as a listener for these events .
*
2018-11-23 12:29:20 +00:00
* @ param EventSubscriber $subscriber The subscriber .
2015-08-17 17:00:26 -07:00
*
* @ return void
*/
public function removeEventSubscriber ( EventSubscriber $subscriber )
{
$this -> removeEventListener ( $subscriber -> getSubscribedEvents (), $subscriber );
}
}