Skip to content

[EventDispatcher] added EventDispatcher::getListenerPriority() #16198

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 12, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -294,27 +294,21 @@ private function getEventDispatcherListenersData(EventDispatcherInterface $event
{
$data = array();

$registeredListeners = $eventDispatcher->getListeners($event, true);
$registeredListeners = $eventDispatcher->getListeners($event);
if (null !== $event) {
krsort($registeredListeners);
foreach ($registeredListeners as $priority => $listeners) {
foreach ($listeners as $listener) {
$listener = $this->getCallableData($listener);
$listener['priority'] = $priority;
$data[] = $listener;
}
foreach ($registeredListeners as $listener) {
$l = $this->getCallableData($listener);
$l['priority'] = $eventDispatcher->getListenerPriority($event, $listener);
$data[] = $l;
}
} else {
ksort($registeredListeners);

foreach ($registeredListeners as $eventListened => $eventListeners) {
krsort($eventListeners);
foreach ($eventListeners as $priority => $listeners) {
foreach ($listeners as $listener) {
$listener = $this->getCallableData($listener);
$listener['priority'] = $priority;
$data[$eventListened][] = $listener;
}
foreach ($eventListeners as $eventListener) {
$l = $this->getCallableData($eventListener);
$l['priority'] = $eventDispatcher->getListenerPriority($eventListened, $eventListener);
$data[$eventListened][] = $l;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,30 +273,23 @@ protected function describeEventDispatcherListeners(EventDispatcherInterface $ev

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

$registeredListeners = $eventDispatcher->getListeners($event, true);
$registeredListeners = $eventDispatcher->getListeners($event);
if (null !== $event) {
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");
}
foreach ($registeredListeners as $order => $listener) {
$this->write("\n".sprintf('## Listener %d', $order + 1)."\n");
$this->describeCallable($listener);
$this->write(sprintf('- Priority: `%d`', $eventDispatcher->getListenerPriority($event, $listener))."\n");
}
} else {
ksort($registeredListeners);

foreach ($registeredListeners as $eventListened => $eventListeners) {
$this->write("\n".sprintf('## %s', $eventListened)."\n");
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");
}

foreach ($eventListeners as $order => $eventListener) {
$this->write("\n".sprintf('### Listener %d', $order + 1)."\n");
$this->describeCallable($eventListener);
$this->write(sprintf('- Priority: `%d`', $eventDispatcher->getListenerPriority($eventListened, $eventListener))."\n");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -358,15 +358,14 @@ protected function describeEventDispatcherListeners(EventDispatcherInterface $ev

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

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

$registeredListeners = $eventDispatcher->getListeners($event);
if (null !== $event) {
$this->renderEventListenerTable($registeredListeners, $options['output']);
$this->renderEventListenerTable($eventDispatcher, $event, $registeredListeners, $options['output']);
} else {
ksort($registeredListeners);
foreach ($registeredListeners as $eventListened => $eventListeners) {
$options['output']->section(sprintf('"%s" event', $eventListened));
$this->renderEventListenerTable($eventListeners, $options['output']);
$this->renderEventListenerTable($eventDispatcher, $eventListened, $eventListeners, $options['output']);
}
}
}
Expand All @@ -382,17 +381,14 @@ protected function describeCallable($callable, array $options = array())
/**
* @param array $array
*/
private function renderEventListenerTable(array $eventListeners, SymfonyStyle $renderer)
private function renderEventListenerTable(EventDispatcherInterface $eventDispatcher, $event, array $eventListeners, SymfonyStyle $renderer)
{
$tableHeaders = array('Order', 'Callable', 'Priority');
$tableRows = array();

krsort($eventListeners);
$order = 1;
foreach ($eventListeners as $priority => $listeners) {
foreach ($listeners as $listener) {
$tableRows[] = array(sprintf('#%d', $order++), $this->formatCallable($listener), $priority);
}
foreach ($eventListeners as $order => $listener) {
$tableRows[] = array(sprintf('#%d', $order + 1), $this->formatCallable($listener), $eventDispatcher->getListenerPriority($event, $listener));
}

$renderer->table($tableHeaders, $tableRows);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -449,17 +449,17 @@ private function getEventDispatcherListenersDocument(EventDispatcherInterface $e
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->appendChild($eventDispatcherXML = $dom->createElement('event-dispatcher'));

$registeredListeners = $eventDispatcher->getListeners($event, true);
$registeredListeners = $eventDispatcher->getListeners($event);
if (null !== $event) {
$this->appendEventListenerDocument($eventDispatcherXML, $registeredListeners);
$this->appendEventListenerDocument($eventDispatcher, $event, $eventDispatcherXML, $registeredListeners);
} else {
ksort($registeredListeners);

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

$this->appendEventListenerDocument($eventXML, $eventListeners);
$this->appendEventListenerDocument($eventDispatcher, $eventListened, $eventXML, $eventListeners);
}
}

Expand All @@ -470,16 +470,13 @@ private function getEventDispatcherListenersDocument(EventDispatcherInterface $e
* @param \DOMElement $element
* @param array $eventListeners
*/
private function appendEventListenerDocument(\DOMElement $element, array $eventListeners)
private function appendEventListenerDocument(EventDispatcherInterface $eventDispatcher, $event, \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);
foreach ($eventListeners as $listener) {
$callableXML = $this->getCallableDocument($listener);
$callableXML->childNodes->item(0)->setAttribute('priority', $eventDispatcher->getListenerPriority($event, $listener));

$element->appendChild($element->ownerDocument->importNode($callableXML->childNodes->item(0), true));
}
$element->appendChild($element->ownerDocument->importNode($callableXML->childNodes->item(0), true));
}
}

Expand Down
1 change: 1 addition & 0 deletions src/Symfony/Bundle/SecurityBundle/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
],
"require": {
"php": ">=5.3.9",
"symfony/event-dispatcher": "~2.8|~3.0.0",
"symfony/security": "~2.8|~3.0.0",
"symfony/security-acl": "~2.7|~3.0.0",
"symfony/http-kernel": "~2.2|~3.0.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public function hasListeners($eventName = null)
/**
* {@inheritdoc}
*/
public function getListeners($eventName = null, $withPriorities = false)
public function getListeners($eventName = null)
{
if (null === $eventName) {
foreach ($this->listenerIds as $serviceEventName => $args) {
Expand All @@ -128,7 +128,17 @@ public function getListeners($eventName = null, $withPriorities = false)
$this->lazyLoad($eventName);
}

return parent::getListeners($eventName, $withPriorities);
return parent::getListeners($eventName);
}

/**
* {@inheritdoc}
*/
public function getListenerPriority($eventName, $listener)
{
$this->lazyLoad($eventName);

return parent::getListenerPriority($eventName, $listener);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,17 @@ public function removeSubscriber(EventSubscriberInterface $subscriber)
/**
* {@inheritdoc}
*/
public function getListeners($eventName = null, $withPriorities = false)
public function getListeners($eventName = null)
{
return $this->dispatcher->getListeners($eventName, $withPriorities);
return $this->dispatcher->getListeners($eventName);
}

/**
* {@inheritdoc}
*/
public function getListenerPriority($eventName, $listener)
{
return $this->dispatcher->getListenerPriority($eventName, $listener);
}

/**
Expand Down Expand Up @@ -141,8 +149,7 @@ public function getCalledListeners()
$called = array();
foreach ($this->called as $eventName => $listeners) {
foreach ($listeners as $listener) {
$priority = $this->getListenerPriority($eventName, $listener);
$info = $this->getListenerInfo($listener->getWrappedListener(), $eventName, $priority);
$info = $this->getListenerInfo($listener->getWrappedListener(), $eventName);
$called[$eventName.'.'.$info['pretty']] = $info;
}
}
Expand All @@ -156,7 +163,7 @@ public function getCalledListeners()
public function getNotCalledListeners()
{
try {
$allListeners = $this->getListeners(null, true);
$allListeners = $this->getListeners();
} catch (\Exception $e) {
if (null !== $this->logger) {
$this->logger->info('An exception was thrown while getting the uncalled listeners.', array('exception' => $e));
Expand All @@ -167,24 +174,22 @@ public function getNotCalledListeners()
}

$notCalled = array();
foreach ($allListeners as $eventName => $priorities) {
foreach ($priorities as $priority => $listeners) {
foreach ($listeners as $listener) {
$called = false;
if (isset($this->called[$eventName])) {
foreach ($this->called[$eventName] as $l) {
if ($l->getWrappedListener() === $listener) {
$called = true;

break;
}
foreach ($allListeners as $eventName => $listeners) {
foreach ($listeners as $listener) {
$called = false;
if (isset($this->called[$eventName])) {
foreach ($this->called[$eventName] as $l) {
if ($l->getWrappedListener() === $listener) {
$called = true;

break;
}
}
}

if (!$called) {
$info = $this->getListenerInfo($listener, $eventName, $priority);
$notCalled[$eventName.'.'.$info['pretty']] = $info;
}
if (!$called) {
$info = $this->getListenerInfo($listener, $eventName);
$notCalled[$eventName.'.'.$info['pretty']] = $info;
}
}
}
Expand Down Expand Up @@ -286,11 +291,11 @@ private function postProcess($eventName)
*
* @return array Information about the listener
*/
private function getListenerInfo($listener, $eventName, $priority = null)
private function getListenerInfo($listener, $eventName)
{
$info = array(
'event' => $eventName,
'priority' => $priority,
'priority' => $this->getListenerPriority($eventName, $listener),
);
if ($listener instanceof \Closure) {
$info += array(
Expand Down Expand Up @@ -339,28 +344,6 @@ private function getListenerInfo($listener, $eventName, $priority = null)
return $info;
}

private function getListenerPriority($eventName, $listenerConfig)
{
try {
$allListeners = $this->getListeners(null, true);
} catch (\Exception $e) {
if (null !== $this->logger) {
$this->logger->info('An exception was thrown while getting the listeners.', array('exception' => $e));
}

return;
}

$listenerWrapper = $listenerConfig->getWrappedListener();
foreach ($allListeners[$eventName] as $priority => $listeners) {
foreach ($listeners as $listener) {
if (is_array($listenerWrapper) && $listenerWrapper[0] === $listener[0]) {
return $priority;
}
}
}
}

private function sortListenersByPriority($a, $b)
{
if (is_int($a['priority']) && !is_int($b['priority'])) {
Expand Down
35 changes: 24 additions & 11 deletions src/Symfony/Component/EventDispatcher/EventDispatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,16 +52,8 @@ public function dispatch($eventName, Event $event = null)
/**
* {@inheritdoc}
*/
public function getListeners($eventName = null, $withPriorities = false)
public function getListeners($eventName = null)
{
if (true === $withPriorities) {
if (null !== $eventName) {
return isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : array();
}

return array_filter($this->listeners);
}

if (null !== $eventName) {
if (!isset($this->listeners[$eventName])) {
return array();
Expand All @@ -83,6 +75,29 @@ public function getListeners($eventName = null, $withPriorities = false)
return array_filter($this->sorted);
}

/**
* Gets the listener priority for a specific event.
*
* Returns null if the event or the listener does not exist.
*
* @param string $eventName The name of the event
* @param callable $listener The listener to remove
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

*
* @return int|null The event listener priority
*/
public function getListenerPriority($eventName, $listener)
{
if (!isset($this->listeners[$eventName])) {
return;
}

foreach ($this->listeners[$eventName] as $priority => $listeners) {
if (false !== ($key = array_search($listener, $listeners, true))) {
return $priority;
}
}
}

/**
* {@inheritdoc}
*/
Expand Down Expand Up @@ -177,8 +192,6 @@ protected function doDispatch($listeners, $eventName, Event $event)
*/
private function sortListeners($eventName)
{
$this->sorted[$eventName] = array();

krsort($this->listeners[$eventName]);
$this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]);
}
Expand Down
12 changes: 10 additions & 2 deletions src/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,17 @@ public function removeSubscriber(EventSubscriberInterface $subscriber)
/**
* {@inheritdoc}
*/
public function getListeners($eventName = null, $withPriorities = false)
public function getListeners($eventName = null)
{
return $this->dispatcher->getListeners($eventName, $withPriorities);
return $this->dispatcher->getListeners($eventName);
}

/**
* {@inheritdoc}
*/
public function getListenerPriority($eventName, $listener)
{
return $this->dispatcher->getListenerPriority($eventName, $listener);
}

/**
Expand Down
Loading