Skip to content

Commit 309dc63

Browse files
committed
[EventDispatcher] added EventDispatcher::getListenerPriority()
1 parent 45b2382 commit 309dc63

File tree

11 files changed

+134
-119
lines changed

11 files changed

+134
-119
lines changed

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -294,27 +294,21 @@ private function getEventDispatcherListenersData(EventDispatcherInterface $event
294294
{
295295
$data = array();
296296

297-
$registeredListeners = $eventDispatcher->getListeners($event, true);
297+
$registeredListeners = $eventDispatcher->getListeners($event);
298298
if (null !== $event) {
299-
krsort($registeredListeners);
300-
foreach ($registeredListeners as $priority => $listeners) {
301-
foreach ($listeners as $listener) {
302-
$listener = $this->getCallableData($listener);
303-
$listener['priority'] = $priority;
304-
$data[] = $listener;
305-
}
299+
foreach ($registeredListeners as $listener) {
300+
$l = $this->getCallableData($listener);
301+
$l['priority'] = $eventDispatcher->getListenerPriority($event, $listener);
302+
$data[] = $l;
306303
}
307304
} else {
308305
ksort($registeredListeners);
309306

310307
foreach ($registeredListeners as $eventListened => $eventListeners) {
311-
krsort($eventListeners);
312-
foreach ($eventListeners as $priority => $listeners) {
313-
foreach ($listeners as $listener) {
314-
$listener = $this->getCallableData($listener);
315-
$listener['priority'] = $priority;
316-
$data[$eventListened][] = $listener;
317-
}
308+
foreach ($eventListeners as $eventListener) {
309+
$l = $this->getCallableData($eventListener);
310+
$l['priority'] = $eventDispatcher->getListenerPriority($eventListened, $eventListener);
311+
$data[$eventListened][] = $l;
318312
}
319313
}
320314
}

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -273,30 +273,23 @@ protected function describeEventDispatcherListeners(EventDispatcherInterface $ev
273273

274274
$this->write(sprintf('# %s', $title)."\n");
275275

276-
$registeredListeners = $eventDispatcher->getListeners($event, true);
276+
$registeredListeners = $eventDispatcher->getListeners($event);
277277
if (null !== $event) {
278-
krsort($registeredListeners);
279-
$order = 1;
280-
foreach ($registeredListeners as $priority => $listeners) {
281-
foreach ($listeners as $listener) {
282-
$this->write("\n".sprintf('## Listener %d', $order++)."\n");
283-
$this->describeCallable($listener);
284-
$this->write(sprintf('- Priority: `%d`', $priority)."\n");
285-
}
278+
foreach ($registeredListeners as $order => $listener) {
279+
$this->write("\n".sprintf('## Listener %d', $order + 1)."\n");
280+
$this->describeCallable($listener);
281+
$this->write(sprintf('- Priority: `%d`', $eventDispatcher->getListenerPriority($event, $listener))."\n");
286282
}
287283
} else {
288284
ksort($registeredListeners);
289285

290286
foreach ($registeredListeners as $eventListened => $eventListeners) {
291287
$this->write("\n".sprintf('## %s', $eventListened)."\n");
292-
krsort($eventListeners);
293-
$order = 1;
294-
foreach ($eventListeners as $priority => $listeners) {
295-
foreach ($listeners as $listener) {
296-
$this->write("\n".sprintf('### Listener %d', $order++)."\n");
297-
$this->describeCallable($listener);
298-
$this->write(sprintf('- Priority: `%d`', $priority)."\n");
299-
}
288+
289+
foreach ($eventListeners as $order => $eventListener) {
290+
$this->write("\n".sprintf('### Listener %d', $order + 1)."\n");
291+
$this->describeCallable($eventListener);
292+
$this->write(sprintf('- Priority: `%d`', $eventDispatcher->getListenerPriority($eventListened, $eventListener))."\n");
300293
}
301294
}
302295
}

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -358,15 +358,14 @@ protected function describeEventDispatcherListeners(EventDispatcherInterface $ev
358358

359359
$options['output']->title($title);
360360

361-
$registeredListeners = $eventDispatcher->getListeners($event, true);
362-
361+
$registeredListeners = $eventDispatcher->getListeners($event);
363362
if (null !== $event) {
364-
$this->renderEventListenerTable($registeredListeners, $options['output']);
363+
$this->renderEventListenerTable($eventDispatcher, $event, $registeredListeners, $options['output']);
365364
} else {
366365
ksort($registeredListeners);
367366
foreach ($registeredListeners as $eventListened => $eventListeners) {
368367
$options['output']->section(sprintf('"%s" event', $eventListened));
369-
$this->renderEventListenerTable($eventListeners, $options['output']);
368+
$this->renderEventListenerTable($eventDispatcher, $eventListened, $eventListeners, $options['output']);
370369
}
371370
}
372371
}
@@ -382,17 +381,14 @@ protected function describeCallable($callable, array $options = array())
382381
/**
383382
* @param array $array
384383
*/
385-
private function renderEventListenerTable(array $eventListeners, SymfonyStyle $renderer)
384+
private function renderEventListenerTable(EventDispatcherInterface $eventDispatcher, $event, array $eventListeners, SymfonyStyle $renderer)
386385
{
387386
$tableHeaders = array('Order', 'Callable', 'Priority');
388387
$tableRows = array();
389388

390-
krsort($eventListeners);
391389
$order = 1;
392-
foreach ($eventListeners as $priority => $listeners) {
393-
foreach ($listeners as $listener) {
394-
$tableRows[] = array(sprintf('#%d', $order++), $this->formatCallable($listener), $priority);
395-
}
390+
foreach ($eventListeners as $order => $listener) {
391+
$tableRows[] = array(sprintf('#%d', $order + 1), $this->formatCallable($listener), $eventDispatcher->getListenerPriority($event, $listener));
396392
}
397393

398394
$renderer->table($tableHeaders, $tableRows);

src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -449,17 +449,17 @@ private function getEventDispatcherListenersDocument(EventDispatcherInterface $e
449449
$dom = new \DOMDocument('1.0', 'UTF-8');
450450
$dom->appendChild($eventDispatcherXML = $dom->createElement('event-dispatcher'));
451451

452-
$registeredListeners = $eventDispatcher->getListeners($event, true);
452+
$registeredListeners = $eventDispatcher->getListeners($event);
453453
if (null !== $event) {
454-
$this->appendEventListenerDocument($eventDispatcherXML, $registeredListeners);
454+
$this->appendEventListenerDocument($eventDispatcher, $event, $eventDispatcherXML, $registeredListeners);
455455
} else {
456456
ksort($registeredListeners);
457457

458458
foreach ($registeredListeners as $eventListened => $eventListeners) {
459459
$eventDispatcherXML->appendChild($eventXML = $dom->createElement('event'));
460460
$eventXML->setAttribute('name', $eventListened);
461461

462-
$this->appendEventListenerDocument($eventXML, $eventListeners);
462+
$this->appendEventListenerDocument($eventDispatcher, $eventListened, $eventXML, $eventListeners);
463463
}
464464
}
465465

@@ -470,16 +470,13 @@ private function getEventDispatcherListenersDocument(EventDispatcherInterface $e
470470
* @param \DOMElement $element
471471
* @param array $eventListeners
472472
*/
473-
private function appendEventListenerDocument(\DOMElement $element, array $eventListeners)
473+
private function appendEventListenerDocument(EventDispatcherInterface $eventDispatcher, $event, \DOMElement $element, array $eventListeners)
474474
{
475-
krsort($eventListeners);
476-
foreach ($eventListeners as $priority => $listeners) {
477-
foreach ($listeners as $listener) {
478-
$callableXML = $this->getCallableDocument($listener);
479-
$callableXML->childNodes->item(0)->setAttribute('priority', $priority);
475+
foreach ($eventListeners as $listener) {
476+
$callableXML = $this->getCallableDocument($listener);
477+
$callableXML->childNodes->item(0)->setAttribute('priority', $eventDispatcher->getListenerPriority($event, $listener));
480478

481-
$element->appendChild($element->ownerDocument->importNode($callableXML->childNodes->item(0), true));
482-
}
479+
$element->appendChild($element->ownerDocument->importNode($callableXML->childNodes->item(0), true));
483480
}
484481
}
485482

src/Symfony/Bundle/SecurityBundle/composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
],
1818
"require": {
1919
"php": ">=5.3.9",
20+
"symfony/event-dispatcher": "~2.8|~3.0.0",
2021
"symfony/security": "~2.8|~3.0.0",
2122
"symfony/security-acl": "~2.7|~3.0.0",
2223
"symfony/http-kernel": "~2.2|~3.0.0"

src/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public function hasListeners($eventName = null)
118118
/**
119119
* {@inheritdoc}
120120
*/
121-
public function getListeners($eventName = null, $withPriorities = false)
121+
public function getListeners($eventName = null)
122122
{
123123
if (null === $eventName) {
124124
foreach ($this->listenerIds as $serviceEventName => $args) {
@@ -128,7 +128,23 @@ public function getListeners($eventName = null, $withPriorities = false)
128128
$this->lazyLoad($eventName);
129129
}
130130

131-
return parent::getListeners($eventName, $withPriorities);
131+
return parent::getListeners($eventName);
132+
}
133+
134+
/**
135+
* {@inheritdoc}
136+
*/
137+
public function getListenerPriority($eventName, $listener)
138+
{
139+
if (null === $eventName) {
140+
foreach ($this->listenerIds as $serviceEventName => $args) {
141+
$this->lazyLoad($serviceEventName);
142+
}
143+
} else {
144+
$this->lazyLoad($eventName);
145+
}
146+
147+
return parent::getListenerPriority($eventName, $listener);
132148
}
133149

134150
/**

src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php

Lines changed: 27 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,17 @@ public function removeSubscriber(EventSubscriberInterface $subscriber)
9494
/**
9595
* {@inheritdoc}
9696
*/
97-
public function getListeners($eventName = null, $withPriorities = false)
97+
public function getListeners($eventName = null)
9898
{
99-
return $this->dispatcher->getListeners($eventName, $withPriorities);
99+
return $this->dispatcher->getListeners($eventName);
100+
}
101+
102+
/**
103+
* {@inheritdoc}
104+
*/
105+
public function getListenerPriority($eventName, $listener)
106+
{
107+
return $this->dispatcher->getListenerPriority($eventName, $listener);
100108
}
101109

102110
/**
@@ -141,8 +149,7 @@ public function getCalledListeners()
141149
$called = array();
142150
foreach ($this->called as $eventName => $listeners) {
143151
foreach ($listeners as $listener) {
144-
$priority = $this->getListenerPriority($eventName, $listener);
145-
$info = $this->getListenerInfo($listener->getWrappedListener(), $eventName, $priority);
152+
$info = $this->getListenerInfo($listener->getWrappedListener(), $eventName);
146153
$called[$eventName.'.'.$info['pretty']] = $info;
147154
}
148155
}
@@ -156,7 +163,7 @@ public function getCalledListeners()
156163
public function getNotCalledListeners()
157164
{
158165
try {
159-
$allListeners = $this->getListeners(null, true);
166+
$allListeners = $this->getListeners();
160167
} catch (\Exception $e) {
161168
if (null !== $this->logger) {
162169
$this->logger->info('An exception was thrown while getting the uncalled listeners.', array('exception' => $e));
@@ -167,24 +174,22 @@ public function getNotCalledListeners()
167174
}
168175

169176
$notCalled = array();
170-
foreach ($allListeners as $eventName => $priorities) {
171-
foreach ($priorities as $priority => $listeners) {
172-
foreach ($listeners as $listener) {
173-
$called = false;
174-
if (isset($this->called[$eventName])) {
175-
foreach ($this->called[$eventName] as $l) {
176-
if ($l->getWrappedListener() === $listener) {
177-
$called = true;
178-
179-
break;
180-
}
177+
foreach ($allListeners as $eventName => $listeners) {
178+
foreach ($listeners as $listener) {
179+
$called = false;
180+
if (isset($this->called[$eventName])) {
181+
foreach ($this->called[$eventName] as $l) {
182+
if ($l->getWrappedListener() === $listener) {
183+
$called = true;
184+
185+
break;
181186
}
182187
}
188+
}
183189

184-
if (!$called) {
185-
$info = $this->getListenerInfo($listener, $eventName, $priority);
186-
$notCalled[$eventName.'.'.$info['pretty']] = $info;
187-
}
190+
if (!$called) {
191+
$info = $this->getListenerInfo($listener, $eventName);
192+
$notCalled[$eventName.'.'.$info['pretty']] = $info;
188193
}
189194
}
190195
}
@@ -286,11 +291,11 @@ private function postProcess($eventName)
286291
*
287292
* @return array Information about the listener
288293
*/
289-
private function getListenerInfo($listener, $eventName, $priority = null)
294+
private function getListenerInfo($listener, $eventName)
290295
{
291296
$info = array(
292297
'event' => $eventName,
293-
'priority' => $priority,
298+
'priority' => $this->getListenerPriority($eventName, $listener),
294299
);
295300
if ($listener instanceof \Closure) {
296301
$info += array(
@@ -339,28 +344,6 @@ private function getListenerInfo($listener, $eventName, $priority = null)
339344
return $info;
340345
}
341346

342-
private function getListenerPriority($eventName, $listenerConfig)
343-
{
344-
try {
345-
$allListeners = $this->getListeners(null, true);
346-
} catch (\Exception $e) {
347-
if (null !== $this->logger) {
348-
$this->logger->info('An exception was thrown while getting the listeners.', array('exception' => $e));
349-
}
350-
351-
return;
352-
}
353-
354-
$listenerWrapper = $listenerConfig->getWrappedListener();
355-
foreach ($allListeners[$eventName] as $priority => $listeners) {
356-
foreach ($listeners as $listener) {
357-
if (is_array($listenerWrapper) && $listenerWrapper[0] === $listener[0]) {
358-
return $priority;
359-
}
360-
}
361-
}
362-
}
363-
364347
private function sortListenersByPriority($a, $b)
365348
{
366349
if (is_int($a['priority']) && !is_int($b['priority'])) {

src/Symfony/Component/EventDispatcher/EventDispatcher.php

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,8 @@ public function dispatch($eventName, Event $event = null)
5252
/**
5353
* {@inheritdoc}
5454
*/
55-
public function getListeners($eventName = null, $withPriorities = false)
55+
public function getListeners($eventName = null)
5656
{
57-
if (true === $withPriorities) {
58-
if (null !== $eventName) {
59-
return isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : array();
60-
}
61-
62-
return array_filter($this->listeners);
63-
}
64-
6557
if (null !== $eventName) {
6658
if (!isset($this->listeners[$eventName])) {
6759
return array();
@@ -83,6 +75,29 @@ public function getListeners($eventName = null, $withPriorities = false)
8375
return array_filter($this->sorted);
8476
}
8577

78+
/**
79+
* Gets the listener priority for a specific event.
80+
*
81+
* Returns null if the event or the listener does not exist.
82+
*
83+
* @param string $eventName The name of the event
84+
* @param callable $listener The listener to remove
85+
*
86+
* @return int|null The event listener priority
87+
*/
88+
public function getListenerPriority($eventName, $listener)
89+
{
90+
if (!isset($this->listeners[$eventName])) {
91+
return;
92+
}
93+
94+
foreach ($this->listeners[$eventName] as $priority => $listeners) {
95+
if (false !== ($key = array_search($listener, $listeners, true))) {
96+
return $priority;
97+
}
98+
}
99+
}
100+
86101
/**
87102
* {@inheritdoc}
88103
*/
@@ -177,8 +192,6 @@ protected function doDispatch($listeners, $eventName, Event $event)
177192
*/
178193
private function sortListeners($eventName)
179194
{
180-
$this->sorted[$eventName] = array();
181-
182195
krsort($this->listeners[$eventName]);
183196
$this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]);
184197
}

src/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,17 @@ public function removeSubscriber(EventSubscriberInterface $subscriber)
7878
/**
7979
* {@inheritdoc}
8080
*/
81-
public function getListeners($eventName = null, $withPriorities = false)
81+
public function getListeners($eventName = null)
8282
{
83-
return $this->dispatcher->getListeners($eventName, $withPriorities);
83+
return $this->dispatcher->getListeners($eventName);
84+
}
85+
86+
/**
87+
* {@inheritdoc}
88+
*/
89+
public function getListenerPriority($eventName, $listener)
90+
{
91+
return $this->dispatcher->getListenerPriority($eventName, $listener);
8492
}
8593

8694
/**

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy