Allow subscribing to multiple events like Symfony EventDispatcher does

This commit is contained in:
Lars Strojny
2013-07-30 11:02:43 -04:00
committed by Jeremy Mikola
parent e6b272951d
commit 62eb20340a
2 changed files with 41 additions and 22 deletions
@@ -92,10 +92,14 @@ class WildcardEventDispatcher implements EventDispatcherInterface
public function addSubscriber(EventSubscriberInterface $subscriber) public function addSubscriber(EventSubscriberInterface $subscriber)
{ {
foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
if (is_array($params)) { if (is_string($params)) {
$this->addListener($eventName, array($subscriber, $params[0]), $params[1]);
} else {
$this->addListener($eventName, array($subscriber, $params)); $this->addListener($eventName, array($subscriber, $params));
} elseif (is_string($params[0])) {
$this->addListener($eventName, array($subscriber, $params[0]), isset($params[1]) ? $params[1] : 0);
} else {
foreach ($params as $listener) {
$this->addListener($eventName, array($subscriber, $listener[0]), isset($listener[1]) ? $listener[1] : 0);
}
} }
} }
} }
@@ -106,7 +110,13 @@ class WildcardEventDispatcher implements EventDispatcherInterface
public function removeSubscriber(EventSubscriberInterface $subscriber) public function removeSubscriber(EventSubscriberInterface $subscriber)
{ {
foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
$this->removeListener($eventName, array($subscriber, is_array($params) ? $params[0] : $params)); if (is_array($params) && is_array($params[0])) {
foreach ($params as $listener) {
$this->removeListener($eventName, array($subscriber, $listener[0]));
}
} else {
$this->removeListener($eventName, array($subscriber, is_string($params) ? $params : $params[0]));
}
} }
} }
@@ -115,27 +115,35 @@ class EventDispatcherTest extends \PHPUnit_Framework_TestCase
*/ */
$subscriber = new TestEventSubscriber(); $subscriber = new TestEventSubscriber();
$i = 0; $this->innerDispatcher->expects($this->at(0))
$defaultPriority = 0; ->method('addListener')
$numSubscribedEvents = count($subscriber->getSubscribedEvents()); ->with('core.request', array($subscriber, 'onRequest'), 0);
$this->innerDispatcher->expects($this->at(1))
->method('addListener')
->with('core.exception', array($subscriber, 'onException'), 10);
$this->innerDispatcher->expects($this->at(2))
->method('addListener')
->with('core.multi', array($subscriber, 'onMulti1'), 10);
$this->innerDispatcher->expects($this->at(3))
->method('addListener')
->with('core.multi', array($subscriber, 'onMulti2'), 20);
foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { $this->innerDispatcher->expects($this->at(4))
$method = is_array($params) ? $params[0] : $params; ->method('removeListener')
$priority = is_array($params) ? $params[1] : $defaultPriority; ->with('core.request', array($subscriber, 'onRequest'));
$this->innerDispatcher->expects($this->at(5))
->method('removeListener')
->with('core.exception', array($subscriber, 'onException'));
$this->innerDispatcher->expects($this->at(6))
->method('removeListener')
->with('core.multi', array($subscriber, 'onMulti1'));
$this->innerDispatcher->expects($this->at(7))
->method('removeListener')
->with('core.multi', array($subscriber, 'onMulti2'));
$this->innerDispatcher->expects($this->at($i))
->method('addListener')
->with($eventName, array($subscriber, $method), $priority);
$this->innerDispatcher->expects($this->at($numSubscribedEvents + $i)) $this->dispatcher->addSubscriber($subscriber);
->method('removeListener') $this->dispatcher->removeSubscriber($subscriber);
->with($eventName, array($subscriber, $method));
++$i;
}
$this->dispatcher->addSubscriber($subscriber, $priority);
$this->dispatcher->removeSubscriber($subscriber, $priority);
} }
private function getMockEventDispatcher() private function getMockEventDispatcher()
@@ -151,6 +159,7 @@ class TestEventSubscriber implements EventSubscriberInterface
return array( return array(
'core.request' => 'onRequest', 'core.request' => 'onRequest',
'core.exception' => array('onException', 10), 'core.exception' => array('onException', 10),
'core.multi' => array(array('onMulti1', 10), array('onMulti2', 20)),
); );
} }
} }