<?php
declare(strict_types=1);
namespace App;
/**
* Event Dispatcher
*/
class Dispatcher
{
/**
* Listeners
*
* @var array
*/
protected $listeners = [];
/**
* getListeners(), returns ALL added listeners.
*
* @return array
*/
public function getListeners() : array
{
return $this->listeners;
}
/**
* Add a single listener i.e: $dispatcher->addListener(EventName, new Path\To\Your\Listener())
*
* @param string $name
* @param Listener $listener
* @return void
*/
public function addListener(string $name, Listener $listener) : void
{
$this->listeners[$name][] = $listener;
}
/**
* Retrieves all listeners listed under the listener @param string $name
*
* @param string $name
* @return array
*/
public function getListenersByEvent(string $name) : array
{
if (!$this->hasListeners($name)) {
return [];
}
return $this->listeners[$name];
}
/**
* Checks whether the requested listener exists or not, otherwise returns false.
*
* @param string $name
* @return boolean
*/
public function hasListeners(string $name) : bool
{
return isset($this->listeners[$name]);
}
/**
* Retrieves listeners through $this->getListenersByEvent(string $name), iterates through them.
* Instance @param Event $event will be passed into the method.
*
* @param Event $event
* @return void
*/
public function dispatch(Event $event) : void
{
foreach ($this->getListenersByEvent($event->getName()) as $listener) {
$listener->handle($event);
}
}
}
|