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);
}
/**