3
namespace GuzzleHttp\Event;
6
* Guzzle event emitter.
8
* Some of this class is based on the Symfony EventDispatcher component, which
9
* ships with the following license:
11
* This file is part of the Symfony package.
13
* (c) Fabien Potencier <fabien@symfony.com>
15
* For the full copyright and license information, please view the LICENSE
16
* file that was distributed with this source code.
18
* @link https://github.com/symfony/symfony/tree/master/src/Symfony/Component/EventDispatcher
20
class Emitter implements EmitterInterface
23
private $listeners = [];
28
public function on($eventName, callable $listener, $priority = 0)
30
if ($priority === 'first') {
31
$priority = isset($this->listeners[$eventName])
32
? max(array_keys($this->listeners[$eventName])) + 1
34
} elseif ($priority === 'last') {
35
$priority = isset($this->listeners[$eventName])
36
? min(array_keys($this->listeners[$eventName])) - 1
40
$this->listeners[$eventName][$priority][] = $listener;
41
unset($this->sorted[$eventName]);
44
public function once($eventName, callable $listener, $priority = 0)
46
$onceListener = function (
47
EventInterface $event,
49
) use (&$onceListener, $eventName, $listener, $priority) {
50
$this->removeListener($eventName, $onceListener);
51
$listener($event, $eventName, $this);
54
$this->on($eventName, $onceListener, $priority);
57
public function removeListener($eventName, callable $listener)
59
if (!isset($this->listeners[$eventName])) {
63
foreach ($this->listeners[$eventName] as $priority => $listeners) {
64
if (false !== ($key = array_search($listener, $listeners, true))) {
66
$this->listeners[$eventName][$priority][$key],
67
$this->sorted[$eventName]
73
public function listeners($eventName = null)
75
// Return all events in a sorted priority order
76
if ($eventName === null) {
77
foreach (array_keys($this->listeners) as $eventName) {
78
if (!isset($this->sorted[$eventName])) {
79
$this->listeners($eventName);
85
// Return the listeners for a specific event, sorted in priority order
86
if (!isset($this->sorted[$eventName])) {
87
if (!isset($this->listeners[$eventName])) {
90
krsort($this->listeners[$eventName]);
91
$this->sorted[$eventName] = call_user_func_array(
93
$this->listeners[$eventName]
98
return $this->sorted[$eventName];
101
public function emit($eventName, EventInterface $event)
103
if (isset($this->listeners[$eventName])) {
104
foreach ($this->listeners($eventName) as $listener) {
105
$listener($event, $eventName);
106
if ($event->isPropagationStopped()) {
115
public function attach(SubscriberInterface $subscriber)
117
foreach ($subscriber->getEvents() as $eventName => $listeners) {
118
if (is_array($listeners[0])) {
119
foreach ($listeners as $listener) {
122
[$subscriber, $listener[0]],
123
isset($listener[1]) ? $listener[1] : 0
129
[$subscriber, $listeners[0]],
130
isset($listeners[1]) ? $listeners[1] : 0
136
public function detach(SubscriberInterface $subscriber)
138
foreach ($subscriber->getEvents() as $eventName => $listener) {
139
$this->removeListener($eventName, array($subscriber, $listener[0]));
143
public function __call($name, $arguments)
145
return \GuzzleHttp\deprecation_proxy(
150
'addSubscriber' => 'attach',
151
'removeSubscriber' => 'detach',
152
'addListener' => 'on',