8000 feature #14563 [FrameworkBundle][EventDispatcher] Add priorities to t… · symfony/symfony@da0194b · GitHub
[go: up one dir, main page]

Skip to content

Commit da0194b

Browse files
committed
feature #14563 [FrameworkBundle][EventDispatcher] Add priorities to the debug:event-dispatcher command (Seldaek)
This PR was merged into the 2.8 branch. Discussion ---------- [FrameworkBundle][EventDispatcher] Add priorities to the debug:event-dispatcher command | Q | A | ------------- | --- | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | | License | MIT | Doc PR | TODO I find it helps to figure out which priority is needed to override another event listener without digging in the sources. Commits ------- 952929c [FrameworkBundle][EventDispatcher] Add priorities to the debug:event-dispatcher command
2 parents 55b3525 + 952929c commit da0194b

17 files changed

+125
-80
lines changed

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,17 +288,27 @@ private function getEventDispatcherListenersData(EventDispatcherInterface $event
288288
{
289289
$data = array();
290290

291-
$registeredListeners = $eventDispatcher->getListeners($event);
291+
$registeredListeners = $eventDispatcher->getListeners($event, true);
292292
if (null !== $event) {
293-
foreach ($registeredListeners as $listener) {
294-
$data[] = $this->getCallableData($listener);
293+
krsort($registeredListeners);
294+
foreach ($registeredListeners as $priority => $listeners) {
295+
foreach ($listeners as $listener) {
296+
$listener = $this->getCallableData($listener);
297+
$listener['priority'] = $priority;
298+
$data[] = $listener;
299+
}
295300
}
296301
} else {
297302
ksort($registeredListeners);
298303

299304
foreach ($registeredListeners as $eventListened => $eventListeners) {
300-
foreach ($eventListeners as $eventListener) {
301-
$data[$eventListened][] = $this->getCallableData($eventListener);
305+
krsort($eventListeners);
306+
foreach ($eventListeners as $priority => $listeners) {
307+
foreach ($listeners as $listener) {
308+
$listener = $this->getCallableData($listener);
309+
$listener['priority'] = $priority;
310+
$data[$eventListened][] = $listener;
311+
}
302312
}
303313
}
304314
}

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -269,21 +269,30 @@ protected function describeEventDispatcherListeners(EventDispatcherInterface $ev
269269

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

272-
$registeredListeners = $eventDispatcher->getListeners($event);
272+
$registeredListeners = $eventDispatcher->getListeners($event, true);
273273
if (null !== $event) {
274-
foreach ($registeredListeners as $order => $listener) {
275-
$this->write("\n".sprintf('## Listener %d', $order + 1)."\n");
276-
$this->describeCallable($listener);
274+
krsort($registeredListeners);
275+
$order = 1;
276+
foreach ($registeredListeners as $priority => $listeners) {
277+
foreach ($listeners as $listener) {
278+
$this->write("\n".sprintf('## Listener %d', $order++)."\n");
279+
$this->describeCallable($listener);
280+
$this->write(sprintf('- Priority: `%d`', $priority)."\n");
281+
}
277282
}
278283
} else {
279284
ksort($registeredListeners);
280285

281286
foreach ($registeredListeners as $eventListened => $eventListeners) {
282287
$this->write("\n".sprintf('## %s', $eventListened)."\n");
283-
284-
foreach ($eventListeners as $order => $eventListener) {
285-
$this->write("\n".sprintf('### Listener %d', $order + 1)."\n");
286-
$this->describeCallable($eventListener);
288+
krsort($eventListeners);
289+
$order = 1;
290+
foreach ($eventListeners as $priority => $listeners) {
291+
foreach ($listeners as $listener) {
292+
$this->write("\n".sprintf('### Listener %d', $order++)."\n");
293+
$this->describeCallable($listener);
294+
$this->write(sprintf('- Priority: `%d`', $priority)."\n");
295+
}
287296
}
288297
}
289298
}

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

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -336,33 +336,16 @@ protected function describeEventDispatcherListeners(EventDispatcherInterface $ev
336336

337337
$this->writeText($this->formatSection('event_dispatcher', $label)."\n", $options);
338338

339-
$registeredListeners = $eventDispatcher->getListeners($event);
339+
$registeredListeners = $eventDispatcher->getListeners($event, true);
340340

341341
if (null !== $event) {
342342
$this->writeText("\n");
343-
$table = new Table($this->getOutput());
344-
$table->getStyle()->setCellHeaderFormat('%s');
345-
$table->setHeaders(array('Order', 'Callable'));
346-
347-
foreach ($registeredListeners as $order => $listener) {
348-
$table->addRow(array(sprintf('#%d', $order + 1), $this->formatCallable($listener)));
349-
}
350-
351-
$table->render();
343+
$this->renderEventListenerTable($registeredListeners);
352344
} else {
353345
ksort($registeredListeners);
354346
foreach ($registeredListeners as $eventListened => $eventListeners) {
355347
$this->writeText(sprintf("\n<info>[Event]</info> %s\n", $eventListened), $options);
356-
357-
$table = new Table($this->getOutput());
358-
$table->getStyle()->setCellHeaderFormat('%s');
359-
$table->setHeaders(array('Order', 'Callable'));
360-
361-
foreach ($eventListeners as $order => $eventListener) {
362-
$table->addRow(array(sprintf('#%d', $order + 1), $this->formatCallable($eventListener)));
363-
}
364-
365-
$table->render();
348+
$this->renderEventListenerTable($eventListeners);
366349
}
367350
}
368351
}
@@ -375,6 +358,26 @@ protected function describeCallable($callable, array $options = array())
375358
$this->writeText($this->formatCallable($callable), $options);
376359
}
377360

361+
/**
362+
* @param array $array
363+
*/
364+
private function renderEventListenerTable(array $eventListeners)
365+
{
366+
$table = new Table($this->getOutput());
367+
$table->getStyle()->setCellHeaderFormat('%s');
368+
$table->setHeaders(array('Order', 'Callable', 'Priority'));
369+
370+
krsort($eventListeners);
371+
$order = 1;
372+
foreach ($eventListeners as $priority => $listeners) {
373+
foreach ($listeners as $listener) {
374+
$table->addRow(array(sprintf('#%d', $order++), $this->formatCallable($listener), $priority));
375+
}
376+
}
377+
378+
$table->render();
379+
}
380+
378381
/**
379382
* @param array $array
380383
*

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

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -446,31 +446,40 @@ private function getEventDispatcherListenersDocument(EventDispatcherInterface $e
446446
$dom = new \DOMDocument('1.0', 'UTF-8');
447447
$dom->appendChild($eventDispatcherXML = $dom->createElement('event-dispatcher'));
448448

449-
$registeredListeners = $eventDispatcher->getListeners($event);
449+
$registeredListeners = $eventDispatcher->getListeners($event, true);
450450
if (null !== $event) {
451-
foreach ($registeredListeners as $listener) {
452-
$callableXML = $this->getCallableDocument($listener);
453-
454-
$eventDispatcherXML->appendChild($eventDispatcherXML->ownerDocument->importNode($callableXML->childNodes->item(0), true));
455-
}
451+
$this->appendEventListenerDocument($eventDispatcherXML, $registeredListeners);
456452
} else {
457453
ksort($registeredListeners);
458454

459455
foreach ($registeredListeners as $eventListened => $eventListeners) {
460456
$eventDispatcherXML->appendChild($eventXML = $dom->createElement('event'));
461457
$eventXML->setAttribute('name', $eventListened);
462458

463-
foreach ($eventListeners as $eventListener) {
464-
$callableXML = $this->getCallableDocument($eventListener);
465-
466-
$eventXML->appendChild($eventXML->ownerDocument->importNode($callableXML->childNodes->item(0), true));
467-
}
459+
$this->appendEventListenerDocument($eventXML, $eventListeners);
468460
}
469461
}
470462

471463
return $dom;
472464
}
473465

466+
/**
467+
* @param DOMElement $element
468+
* @param array $eventListeners
469+
*/
470+
private function appendEventListenerDocument(\DOMElement $element, array $eventListeners)
471+
{
472+
krsort($eventListeners);
473+
foreach ($eventListeners as $priority => $listeners) {
474+
foreach ($listeners as $listener) {
475+
$callableXML = $this->getCallableDocument($listener);
476+
$callableXML->childNodes->item(0)->setAttribute('priority', $priority);
477+
478+
$element->appendChild($element->ownerDocument->importNode($callableXML->childNodes->item(0), true));
479+
}
480+
}
481+
}
482+
474483
/**
475484
* @param callable $callable
476485
*

src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/ObjectsProvider.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ public static function getEventDispatchers()
157157
{
158158
$eventDispatcher = new EventDispatcher();
159159

160-
$eventDispatcher->addListener('event1', 'global_function');
161-
$eventDispatcher->addListener('event1', function () { return 'Closure'; });
160+
$eventDispatcher->addListener('event1', 'global_function', 255);
161+
$eventDispatcher->addListener('event1', function () { return 'Closure'; }, -1);
162162
$eventDispatcher->addListener('event2', new CallableClass());
163163

164164
return array('event_dispatcher_1' => $eventDispatcher);
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
[
22
{
33
"type": "function",
4-
"name": "global_function"
4+
"name": "global_function",
5+
"priority": 255
56
},
67
{
7-
"type": "closure"
8+
"type": "closure",
9+
"priority": -1
810
}
911
]

src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
- Type: `function`
66
- Name: `global_function`
7+
- Priority: `255`
78

< F438 div aria-hidden="true" class="position-absolute top-0 d-flex user-select-none DiffLineTableCellParts-module__comment-indicator--eI0hb">
89
## Listener 2
910

1011
- Type: `closure`
12+
- Priority: `-1`
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<info>[event_dispatcher]</info> Registered listeners for event <info>event1</info>
22

3-
+-------+-------------------+
4-
| Order | Callable |
5-
+-------+-------------------+
6-
| #1 | global_function() |
7-
| #2 | \Closure() |
8-
+-------+-------------------+
3+
+-------+-------------------+----------+
4+
| Order | Callable | Priority |
5+
+-------+-------------------+----------+
6+
| #1 | global_function() | 255 |
7+
| #2 | \Closure() | -1 |
8+
+-------+-------------------+----------+
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<event-dispatcher>
3-
<callable type="function" name="global_function"/>
4-
<callable type="closure"/>
3+
<callable type="function" name="global_function" priority="255"/>
4+
<callable type="closure" priority="-1"/>
55
</event-dispatcher>

src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@
22
"event1": [
33
{
44
"type": "function",
5-
"name": "global_function"
5+
"name": "global_function",
6+
"priority": 255
67
},
78
{
8-
"type": "closure"
9+
"type": "closure",
10+
"priority": -1
911
}
1012
],
1113
"event2": [
1214
{
1315
"type": "object",
14-
"name": "Symfony\\Bundle\\FrameworkBundle\\Tests\\Console\\Descriptor\\CallableClass"
16+
"name": "Symfony\\Bundle\\FrameworkBundle\\Tests\\Console\\Descriptor\\CallableClass",
17+
"priority": 0
1518
}
1619
]
1720
}

src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66

77
- Type: `function`
88
- Name: `global_function`
9+
- Priority: `255`
910

1011
### Listener 2
1112

1213
- Type: `closure`
14+
- Priority: `-1`
1315

1416
## event2
1517

1618
### Listener 1
1719

1820
- Type: `object`
1921
- Name: `Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\CallableClass`
22+
- Priority: `0`
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
<info>[event_dispatcher]</info> Registered listeners by event
22

33
<info>[Event]</info> event1
4-
+-------+-------------------+
5-
| Order | Callable |
6-
+-------+-------------------+
7-
| #1 | global_function() |
8-
| #2 | \Closure() |
9-
+-------+-------------------+
4+
+-------+-------------------+----------+
5+
| Order | Callable | Priority |
6+
+-------+-------------------+----------+
7+
| #1 | global_function() | 255 |
8+
| #2 | \Closure() | -1 |
9+
+-------+-------------------+----------+
1010

1111
<info>[Event]</info> event2
12-
+-------+-----------------------------------------------------------------------------------+
13-
| Order | Callable |
14-
+-------+-----------------------------------------------------------------------------------+
15-
| #1 | Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\CallableClass::__invoke() |
16-
+-------+-----------------------------------------------------------------------------------+
12+
+-------+-----------------------------------------------------------------------------------+----------+
13+
| Order | Callable | Priority |
14+
+-------+-----------------------------------------------------------------------------------+----------+
15+
| #1 | Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\CallableClass::__invoke() | 0 |
16+
+-------+-----------------------------------------------------------------------------------+----------+
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<event-dispatcher>
33
<event name="event1">
4-
<callable type="function" name="global_function"/>
5-
<callable type="closure"/>
4+
<callable type="function" name="global_function" priority="255"/>
5+
<callable type="closure" priority="-1"/>
66
</event>
77
<event name="event2">
8-
<callable type="object" name="Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\CallableClass"/>
8+
<callable type="object" name="Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\CallableClass" priority="0"/>
99
</event>
1010
</event-dispatcher>

src/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php

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

131-
return parent::getListeners($eventName);
131+
return parent::getListeners($eventName, $withPriorities);
132132
}
133133

134134
/**

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ public function removeSubscriber(EventSubscriberInterface $subscriber)
9494
/**
9595
* {@inheritdoc}
9696
*/
97-
public function getListeners($eventName = null)
97+
public function getListeners($eventName = null, $withPriorities = false)
9898
{
99-
return $this->dispatcher->getListeners($eventName);
99+
return $this->dispatcher->getListeners($eventName, $withPriorities);
100100
}
101101

102102
/**

src/Symfony/Component/EventDispatcher/EventDispatcher.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,12 @@ public function dispatch($eventName, Event $event = null)
5858
/**
5959
* @see EventDispatcherInterface::getListeners()
6060
*/
61-
public function getListeners($eventName = null)
61+
public function getListeners($eventName = null, $withPriorities = false)
6262
{
63+
if (true === $withPriorities) {
64+
return $eventName ? $this->listeners[$eventName] : array_filter($this->listeners);
65+
}
66+
6367
if (null !== $eventName) {
6468
if (!isset($this->sorted[$eventName])) {
6569
$this->sortListeners($eventName);

src/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php

-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ public function removeSubscriber(EventSubscriberInterface $subscriber)
7878
/**
7979
* {@inheritdoc}
8080
*/
81-
public function getListeners($eventName = null)
81+
public function getListeners($eventName = null, $withPriorities = false)
8282
{
83-
return $this->dispatcher->getListeners($eventName);
83+
return $this->dispatcher->getListeners($eventName, $withPriorities);
8484
}
8585

8686
/**

0 commit comments

Comments
 (0)
0