From 952929cb67614309556f876583cafafcf9e860a9 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 5 May 2015 21:46:18 +0100 Subject: [PATCH] [FrameworkBundle][EventDispatcher] Add priorities to the debug:event-dispatcher command --- .../Console/Descriptor/JsonDescriptor.php | 20 ++++++--- .../Console/Descriptor/MarkdownDescriptor.php | 25 +++++++---- .../Console/Descriptor/TextDescriptor.php | 43 ++++++++++--------- .../Console/Descriptor/XmlDescriptor.php | 31 ++++++++----- .../Console/Descriptor/ObjectsProvider.php | 4 +- .../Descriptor/event_dispatcher_1_event1.json | 6 ++- .../Descriptor/event_dispatcher_1_event1.md | 2 + .../Descriptor/event_dispatcher_1_event1.txt | 12 +++--- .../Descriptor/event_dispatcher_1_event1.xml | 4 +- .../Descriptor/event_dispatcher_1_events.json | 9 ++-- .../Descriptor/event_dispatcher_1_events.md | 3 ++ .../Descriptor/event_dispatcher_1_events.txt | 22 +++++----- .../Descriptor/event_dispatcher_1_events.xml | 6 +-- .../ContainerAwareEventDispatcher.php | 4 +- .../Debug/TraceableEventDispatcher.php | 4 +- .../EventDispatcher/EventDispatcher.php | 6 ++- .../ImmutableEventDispatcher.php | 4 +- 17 files changed, 125 insertions(+), 80 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php index e2da8cffe7973..9c3a0648dd6b5 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php @@ -288,17 +288,27 @@ private function getEventDispatcherListenersData(EventDispatcherInterface $event { $data = array(); - $registeredListeners = $eventDispatcher->getListeners($event); + $registeredListeners = $eventDispatcher->getListeners($event, true); if (null !== $event) { - foreach ($registeredListeners as $listener) { - $data[] = $this->getCallableData($listener); + krsort($registeredListeners); + foreach ($registeredListeners as $priority => $listeners) { + foreach ($listeners as $listener) { + $listener = $this->getCallableData($listener); + $listener['priority'] = $priority; + $data[] = $listener; + } } } else { ksort($registeredListeners); foreach ($registeredListeners as $eventListened => $eventListeners) { - foreach ($eventListeners as $eventListener) { - $data[$eventListened][] = $this->getCallableData($eventListener); + krsort($eventListeners); + foreach ($eventListeners as $priority => $listeners) { + foreach ($listeners as $listener) { + $listener = $this->getCallableData($listener); + $listener['priority'] = $priority; + $data[$eventListened][] = $listener; + } } } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php index 84877461c832a..a47ff781dd0b2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php @@ -269,21 +269,30 @@ protected function describeEventDispatcherListeners(EventDispatcherInterface $ev $this->write(sprintf('# %s', $title)."\n"); - $registeredListeners = $eventDispatcher->getListeners($event); + $registeredListeners = $eventDispatcher->getListeners($event, true); if (null !== $event) { - foreach ($registeredListeners as $order => $listener) { - $this->write("\n".sprintf('## Listener %d', $order + 1)."\n"); - $this->describeCallable($listener); + krsort($registeredListeners); + $order = 1; + foreach ($registeredListeners as $priority => $listeners) { + foreach ($listeners as $listener) { + $this->write("\n".sprintf('## Listener %d', $order++)."\n"); + $this->describeCallable($listener); + $this->write(sprintf('- Priority: `%d`', $priority)."\n"); + } } } else { ksort($registeredListeners); foreach ($registeredListeners as $eventListened => $eventListeners) { $this->write("\n".sprintf('## %s', $eventListened)."\n"); - - foreach ($eventListeners as $order => $eventListener) { - $this->write("\n".sprintf('### Listener %d', $order + 1)."\n"); - $this->describeCallable($eventListener); + krsort($eventListeners); + $order = 1; + foreach ($eventListeners as $priority => $listeners) { + foreach ($listeners as $listener) { + $this->write("\n".sprintf('### Listener %d', $order++)."\n"); + $this->describeCallable($listener); + $this->write(sprintf('- Priority: `%d`', $priority)."\n"); + } } } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php index 56ffa455faca8..47d717f2825f1 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php @@ -336,33 +336,16 @@ protected function describeEventDispatcherListeners(EventDispatcherInterface $ev $this->writeText($this->formatSection('event_dispatcher', $label)."\n", $options); - $registeredListeners = $eventDispatcher->getListeners($event); + $registeredListeners = $eventDispatcher->getListeners($event, true); if (null !== $event) { $this->writeText("\n"); - $table = new Table($this->getOutput()); - $table->getStyle()->setCellHeaderFormat('%s'); - $table->setHeaders(array('Order', 'Callable')); - - foreach ($registeredListeners as $order => $listener) { - $table->addRow(array(sprintf('#%d', $order + 1), $this->formatCallable($listener))); - } - - $table->render(); + $this->renderEventListenerTable($registeredListeners); } else { ksort($registeredListeners); foreach ($registeredListeners as $eventListened => $eventListeners) { $this->writeText(sprintf("\n[Event] %s\n", $eventListened), $options); - - $table = new Table($this->getOutput()); - $table->getStyle()->setCellHeaderFormat('%s'); - $table->setHeaders(array('Order', 'Callable')); - - foreach ($eventListeners as $order => $eventListener) { - $table->addRow(array(sprintf('#%d', $order + 1), $this->formatCallable($eventListener))); - } - - $table->render(); + $this->renderEventListenerTable($eventListeners); } } } @@ -375,6 +358,26 @@ protected function describeCallable($callable, array $options = array()) $this->writeText($this->formatCallable($callable), $options); } + /** + * @param array $array + */ + private function renderEventListenerTable(array $eventListeners) + { + $table = new Table($this->getOutput()); + $table->getStyle()->setCellHeaderFormat('%s'); + $table->setHeaders(array('Order', 'Callable', 'Priority')); + + krsort($eventListeners); + $order = 1; + foreach ($eventListeners as $priority => $listeners) { + foreach ($listeners as $listener) { + $table->addRow(array(sprintf('#%d', $order++), $this->formatCallable($listener), $priority)); + } + } + + $table->render(); + } + /** * @param array $array * diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php index c37a9009fcff5..e62c71a2a018e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php @@ -446,13 +446,9 @@ private function getEventDispatcherListenersDocument(EventDispatcherInterface $e $dom = new \DOMDocument('1.0', 'UTF-8'); $dom->appendChild($eventDispatcherXML = $dom->createElement('event-dispatcher')); - $registeredListeners = $eventDispatcher->getListeners($event); + $registeredListeners = $eventDispatcher->getListeners($event, true); if (null !== $event) { - foreach ($registeredListeners as $listener) { - $callableXML = $this->getCallableDocument($listener); - - $eventDispatcherXML->appendChild($eventDispatcherXML->ownerDocument->importNode($callableXML->childNodes->item(0), true)); - } + $this->appendEventListenerDocument($eventDispatcherXML, $registeredListeners); } else { ksort($registeredListeners); @@ -460,17 +456,30 @@ private function getEventDispatcherListenersDocument(EventDispatcherInterface $e $eventDispatcherXML->appendChild($eventXML = $dom->createElement('event')); $eventXML->setAttribute('name', $eventListened); - foreach ($eventListeners as $eventListener) { - $callableXML = $this->getCallableDocument($eventListener); - - $eventXML->appendChild($eventXML->ownerDocument->importNode($callableXML->childNodes->item(0), true)); - } + $this->appendEventListenerDocument($eventXML, $eventListeners); } } return $dom; } + /** + * @param DOMElement $element + * @param array $eventListeners + */ + private function appendEventListenerDocument(\DOMElement $element, array $eventListeners) + { + krsort($eventListeners); + foreach ($eventListeners as $priority => $listeners) { + foreach ($listeners as $listener) { + $callableXML = $this->getCallableDocument($listener); + $callableXML->childNodes->item(0)->setAttribute('priority', $priority); + + $element->appendChild($element->ownerDocument->importNode($callableXML->childNodes->item(0), true)); + } + } + } + /** * @param callable $callable * diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/ObjectsProvider.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/ObjectsProvider.php index 94db08b5bdc91..1ad6c286be1c0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/ObjectsProvider.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/ObjectsProvider.php @@ -157,8 +157,8 @@ public static function getEventDispatchers() { $eventDispatcher = new EventDispatcher(); - $eventDispatcher->addListener('event1', 'global_function'); - $eventDispatcher->addListener('event1', function () { return 'Closure'; }); + $eventDispatcher->addListener('event1', 'global_function', 255); + $eventDispatcher->addListener('event1', function () { return 'Closure'; }, -1); $eventDispatcher->addListener('event2', new CallableClass()); return array('event_dispatcher_1' => $eventDispatcher); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.json b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.json index e40e130d453cb..4b68f0cefc0e4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.json +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.json @@ -1,9 +1,11 @@ [ { "type": "function", - "name": "global_function" + "name": "global_function", + "priority": 255 }, { - "type": "closure" + "type": "closure", + "priority": -1 } ] diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.md b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.md index 206c44f717526..98b81ecdce422 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.md +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.md @@ -4,7 +4,9 @@ - Type: `function` - Name: `global_function` +- Priority: `255` ## Listener 2 - Type: `closure` +- Priority: `-1` diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.txt b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.txt index 22b17a19cfb91..45035d12d6228 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.txt +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.txt @@ -1,8 +1,8 @@ [event_dispatcher] Registered listeners for event event1 -+-------+-------------------+ -| Order | Callable | -+-------+-------------------+ -| #1 | global_function() | -| #2 | \Closure() | -+-------+-------------------+ ++-------+-------------------+----------+ +| Order | Callable | Priority | ++-------+-------------------+----------+ +| #1 | global_function() | 255 | +| #2 | \Closure() | -1 | ++-------+-------------------+----------+ diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.xml index 4806f1f1280c7..bc03189af7b80 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_event1.xml @@ -1,5 +1,5 @@ - - + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.json b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.json index 56fc7a4f1e546..30772d9a4a212 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.json +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.json @@ -2,16 +2,19 @@ "event1": [ { "type": "function", - "name": "global_function" + "name": "global_function", + "priority": 255 }, { - "type": "closure" + "type": "closure", + "priority": -1 } ], "event2": [ { "type": "object", - "name": "Symfony\\Bundle\\FrameworkBundle\\Tests\\Console\\Descriptor\\CallableClass" + "name": "Symfony\\Bundle\\FrameworkBundle\\Tests\\Console\\Descriptor\\CallableClass", + "priority": 0 } ] } diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.md b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.md index ad4b79e3117fa..eb809789d5f17 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.md +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.md @@ -6,10 +6,12 @@ - Type: `function` - Name: `global_function` +- Priority: `255` ### Listener 2 - Type: `closure` +- Priority: `-1` ## event2 @@ -17,3 +19,4 @@ - Type: `object` - Name: `Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\CallableClass` +- Priority: `0` diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.txt b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.txt index 95a5b4648e939..88e5dc9c89692 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.txt +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.txt @@ -1,16 +1,16 @@ [event_dispatcher] Registered listeners by event [Event] event1 -+-------+-------------------+ -| Order | Callable | -+-------+-------------------+ -| #1 | global_function() | -| #2 | \Closure() | -+-------+-------------------+ ++-------+-------------------+----------+ +| Order | Callable | Priority | ++-------+-------------------+----------+ +| #1 | global_function() | 255 | +| #2 | \Closure() | -1 | ++-------+-------------------+----------+ [Event] event2 -+-------+-----------------------------------------------------------------------------------+ -| Order | Callable | -+-------+-----------------------------------------------------------------------------------+ -| #1 | Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\CallableClass::__invoke() | -+-------+-----------------------------------------------------------------------------------+ ++-------+-----------------------------------------------------------------------------------+----------+ +| Order | Callable | Priority | ++-------+-----------------------------------------------------------------------------------+----------+ +| #1 | Symfony\Bundle\FrameworkBundle\Tests\Console\Descriptor\CallableClass::__invoke() | 0 | ++-------+-----------------------------------------------------------------------------------+----------+ diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.xml index 3e4b20d823798..d7443f9743666 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/event_dispatcher_1_events.xml @@ -1,10 +1,10 @@ - - + + - + diff --git a/src/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php b/src/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php index 76f0e387762a3..e71da1fb67163 100644 --- a/src/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php +++ b/src/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php @@ -118,7 +118,7 @@ public function hasListeners($eventName = null) /** * @see EventDispatcherInterface::getListeners() */ - public function getListeners($eventName = null) + public function getListeners($eventName = null, $withPriorities = false) { if (null === $eventName) { foreach ($this->listenerIds as $serviceEventName => $args) { @@ -128,7 +128,7 @@ public function getListeners($eventName = null) $this->lazyLoad($eventName); } - return parent::getListeners($eventName); + return parent::getListeners($eventName, $withPriorities); } /** diff --git a/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php b/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php index 7653ccfb7175f..0106f74f3a302 100644 --- a/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php +++ b/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php @@ -94,9 +94,9 @@ public function removeSubscriber(EventSubscriberInterface $subscriber) /** * {@inheritdoc} */ - public function getListeners($eventName = null) + public function getListeners($eventName = null, $withPriorities = false) { - return $this->dispatcher->getListeners($eventName); + return $this->dispatcher->getListeners($eventName, $withPriorities); } /** diff --git a/src/Symfony/Component/EventDispatcher/EventDispatcher.php b/src/Symfony/Component/EventDispatcher/EventDispatcher.php index 46c11100b3416..e3d587939f985 100644 --- a/src/Symfony/Component/EventDispatcher/EventDispatcher.php +++ b/src/Symfony/Component/EventDispatcher/EventDispatcher.php @@ -58,8 +58,12 @@ public function dispatch($eventName, Event $event = null) /** * @see EventDispatcherInterface::getListeners() */ - public function getListeners($eventName = null) + public function getListeners($eventName = null, $withPriorities = false) { + if (true === $withPriorities) { + return $eventName ? $this->listeners[$eventName] : array_filter($this->listeners); + } + if (null !== $eventName) { if (!isset($this->sorted[$eventName])) { $this->sortListeners($eventName); diff --git a/src/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php b/src/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php index 7ef9ece75718f..f979304e9cee2 100644 --- a/src/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php +++ b/src/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php @@ -78,9 +78,9 @@ public function removeSubscriber(EventSubscriberInterface $subscriber) /** * {@inheritdoc} */ - public function getListeners($eventName = null) + public function getListeners($eventName = null, $withPriorities = false) { - return $this->dispatcher->getListeners($eventName); + return $this->dispatcher->getListeners($eventName, $withPriorities); } /**