-
Notifications
You must be signed in to change notification settings - Fork 118
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #343 from mbonneau/event-dispatcher
Drop symfony/event-dispatcher dependency
- Loading branch information
Showing
6 changed files
with
435 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,7 +2,56 @@ | |
|
||
namespace Thruway\Event; | ||
|
||
class Event extends \Symfony\Component\EventDispatcher\Event | ||
class Event | ||
{ | ||
/* | ||
* Everything below taken from symfony/event-dispatcher at 3.4.41 | ||
* | ||
* (c) Fabien Potencier <[email protected]> | ||
* | ||
* For the full copyright and license information, please view the LICENSE | ||
* file that was distributed with this source code. | ||
*/ | ||
/* | ||
* Event is the base class for classes containing event data. | ||
* | ||
* This class contains no event data. It is used by events that do not pass | ||
* state information to an event handler when an event is raised. | ||
* | ||
* You can call the method stopPropagation() to abort the execution of | ||
* further listeners in your event listener. | ||
* | ||
* @author Guilherme Blanco <[email protected]> | ||
* @author Jonathan Wage <[email protected]> | ||
* @author Roman Borschel <[email protected]> | ||
* @author Bernhard Schussek <[email protected]> | ||
*/ | ||
/** | ||
* @var bool Whether no further event listeners should be triggered | ||
*/ | ||
private $propagationStopped = false; | ||
|
||
/** | ||
* Returns whether further event listeners should be triggered. | ||
* | ||
* @see Event::stopPropagation() | ||
* | ||
* @return bool Whether propagation was already stopped for this event | ||
*/ | ||
public function isPropagationStopped() | ||
{ | ||
return $this->propagationStopped; | ||
} | ||
|
||
/** | ||
* Stops the propagation of the event to further event listeners. | ||
* | ||
* If multiple event listeners are connected to the same event, no | ||
* further event listener will be triggered once any trigger calls | ||
* stopPropagation(). | ||
*/ | ||
public function stopPropagation() | ||
{ | ||
$this->propagationStopped = true; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,7 @@ | |
|
||
use Thruway\Module\RealmModuleInterface; | ||
|
||
class EventDispatcher extends \Symfony\Component\EventDispatcher\EventDispatcher implements EventDispatcherInterface | ||
class EventDispatcher implements EventDispatcherInterface | ||
{ | ||
public function addRealmSubscriber(RealmModuleInterface $subscriber) | ||
{ | ||
|
@@ -13,4 +13,235 @@ public function addRealmSubscriber(RealmModuleInterface $subscriber) | |
$this->addListener($eventName, [$subscriber, $event[0]], $event[1]); | ||
} | ||
} | ||
|
||
/* | ||
* Everything below taken from symfony/event-dispatcher at 3.4.41 | ||
* | ||
* (c) Fabien Potencier <[email protected]> | ||
* | ||
* For the full copyright and license information, please view the LICENSE | ||
* file that was distributed with this source code. | ||
*/ | ||
/* | ||
* The EventDispatcherInterface is the central point of Symfony's event listener system. | ||
* | ||
* Listeners are registered on the manager and events are dispatched through the | ||
* manager. | ||
* | ||
* @author Guilherme Blanco <[email protected]> | ||
* @author Jonathan Wage <[email protected]> | ||
* @author Roman Borschel <[email protected]> | ||
* @author Bernhard Schussek <[email protected]> | ||
* @author Fabien Potencier <[email protected]> | ||
* @author Jordi Boggiano <[email protected]> | ||
* @author Jordan Alliot <[email protected]> | ||
* @author Nicolas Grekas <[email protected]> | ||
*/ | ||
private $listeners = []; | ||
private $sorted = []; | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function dispatch($eventName, Event $event = null) | ||
{ | ||
if (null === $event) { | ||
$event = new Event(); | ||
} | ||
|
||
if ($listeners = $this->getListeners($eventName)) { | ||
$this->doDispatch($listeners, $eventName, $event); | ||
} | ||
|
||
return $event; | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function getListeners($eventName = null) | ||
{ | ||
if (null !== $eventName) { | ||
if (empty($this->listeners[$eventName])) { | ||
return []; | ||
} | ||
|
||
if (!isset($this->sorted[$eventName])) { | ||
$this->sortListeners($eventName); | ||
} | ||
|
||
return $this->sorted[$eventName]; | ||
} | ||
|
||
foreach ($this->listeners as $eventName => $eventListeners) { | ||
if (!isset($this->sorted[$eventName])) { | ||
$this->sortListeners($eventName); | ||
} | ||
} | ||
|
||
return array_filter($this->sorted); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function getListenerPriority($eventName, $listener) | ||
{ | ||
if (empty($this->listeners[$eventName])) { | ||
return null; | ||
} | ||
|
||
if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) { | ||
$listener[0] = $listener[0](); | ||
} | ||
|
||
foreach ($this->listeners[$eventName] as $priority => $listeners) { | ||
foreach ($listeners as $k => $v) { | ||
if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure) { | ||
$v[0] = $v[0](); | ||
$this->listeners[$eventName][$priority][$k] = $v; | ||
} | ||
if ($v === $listener) { | ||
return $priority; | ||
} | ||
} | ||
} | ||
|
||
return null; | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function hasListeners($eventName = null) | ||
{ | ||
if (null !== $eventName) { | ||
return !empty($this->listeners[$eventName]); | ||
} | ||
|
||
foreach ($this->listeners as $eventListeners) { | ||
if ($eventListeners) { | ||
return true; | ||
} | ||
} | ||
|
||
return false; | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function addListener($eventName, $listener, $priority = 0) | ||
{ | ||
$this->listeners[$eventName][$priority][] = $listener; | ||
unset($this->sorted[$eventName]); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function removeListener($eventName, $listener) | ||
{ | ||
if (empty($this->listeners[$eventName])) { | ||
return; | ||
} | ||
|
||
if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) { | ||
$listener[0] = $listener[0](); | ||
} | ||
|
||
foreach ($this->listeners[$eventName] as $priority => $listeners) { | ||
foreach ($listeners as $k => $v) { | ||
if ($v !== $listener && \is_array($v) && isset($v[0]) && $v[0] instanceof \Closure) { | ||
$v[0] = $v[0](); | ||
} | ||
if ($v === $listener) { | ||
unset($listeners[$k], $this->sorted[$eventName]); | ||
} else { | ||
$listeners[$k] = $v; | ||
} | ||
} | ||
|
||
if ($listeners) { | ||
$this->listeners[$eventName][$priority] = $listeners; | ||
} else { | ||
unset($this->listeners[$eventName][$priority]); | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function addSubscriber(EventSubscriberInterface $subscriber) | ||
{ | ||
foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { | ||
if (\is_string($params)) { | ||
$this->addListener($eventName, [$subscriber, $params]); | ||
} elseif (\is_string($params[0])) { | ||
$this->addListener($eventName, [$subscriber, $params[0]], isset($params[1]) ? $params[1] : 0); | ||
} else { | ||
foreach ($params as $listener) { | ||
$this->addListener($eventName, [$subscriber, $listener[0]], isset($listener[1]) ? $listener[1] : 0); | ||
} | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function removeSubscriber(EventSubscriberInterface $subscriber) | ||
{ | ||
foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { | ||
if (\is_array($params) && \is_array($params[0])) { | ||
foreach ($params as $listener) { | ||
$this->removeListener($eventName, [$subscriber, $listener[0]]); | ||
} | ||
} else { | ||
$this->removeListener($eventName, [$subscriber, \is_string($params) ? $params : $params[0]]); | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* Triggers the listeners of an event. | ||
* | ||
* This method can be overridden to add functionality that is executed | ||
* for each listener. | ||
* | ||
* @param callable[] $listeners The event listeners | ||
* @param string $eventName The name of the event to dispatch | ||
* @param Event $event The event object to pass to the event handlers/listeners | ||
*/ | ||
protected function doDispatch($listeners, $eventName, Event $event) | ||
{ | ||
foreach ($listeners as $listener) { | ||
if ($event->isPropagationStopped()) { | ||
break; | ||
} | ||
\call_user_func($listener, $event, $eventName, $this); | ||
} | ||
} | ||
|
||
/** | ||
* Sorts the internal list of listeners for the given event by priority. | ||
* | ||
* @param string $eventName The name of the event | ||
*/ | ||
private function sortListeners($eventName) | ||
{ | ||
krsort($this->listeners[$eventName]); | ||
$this->sorted[$eventName] = []; | ||
|
||
foreach ($this->listeners[$eventName] as $priority => $listeners) { | ||
foreach ($listeners as $k => $listener) { | ||
if (\is_array($listener) && isset($listener[0]) && $listener[0] instanceof \Closure) { | ||
$listener[0] = $listener[0](); | ||
$this->listeners[$eventName][$priority][$k] = $listener; | ||
} | ||
$this->sorted[$eventName][] = $listener; | ||
} | ||
} | ||
} | ||
} |
Oops, something went wrong.