Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b03ccb3

Browse files
committed
feature #16198 [EventDispatcher] added EventDispatcher::getListenerPriority() (fabpot)
This PR was merged into the 2.8 branch. Discussion ---------- [EventDispatcher] added EventDispatcher::getListenerPriority() | Q | A | ------------- | --- | Bug fix? | yes | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #14563, #15825 | License | MIT | Doc PR | n/a In #14563, we added a way to get the priorities of listeners, but as noted by @Tobion in #15825, the implementation is sub-optimal because of two main reasons: the change is not part of the interface but more importantly, the added boolean changes the return value of `getListeners()`. This PR reverts most of #14563 to add a `getListenerPriority()` method. This method is quite slow, but as it should only be used for debugging purposes (on the CLI or the WDT), I think it's not really a problem. In 3.0, this method should probably be added to `EventDispatcherInterface`. ping @Tobion Commits ------- 068e955 [EventDispatcher] added EventDispatcher::getListenerPriority()
2 parents d36e284 + 068e955 commit b03ccb3

11 files changed

+128
-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: 12 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,17 @@ 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+
$this->lazyLoad($eventName);
140+
141+
return parent::getListenerPriority($eventName, $listener);
132142
}
133143

134144
/**

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)