diff --git a/src/Event/EventDispatcher.php b/src/Event/EventDispatcher.php index a503e89a..c430a80b 100644 --- a/src/Event/EventDispatcher.php +++ b/src/Event/EventDispatcher.php @@ -65,10 +65,25 @@ public function dispatch(EventInterface $event) } /** - * @param string $eventName + * @param string $eventNames + * @param callable $callback + */ + public function listen($eventNames, callable $callback) + { + if (!is_array($eventNames)) { + $eventNames = [$eventNames]; + } + + foreach ($eventNames as $eventName) { + $this->attachListener($eventName, $callback); + } + } + + /** + * @param string|array $eventName * @param callable $callback */ - public function listen($eventName, callable $callback) + private function attachListener($eventName, callable $callback) { if (!array_key_exists($eventName, $this->listeners)) { $this->listeners[$eventName] = [$callback]; diff --git a/test/Event/EventDispatcherTest.php b/test/Event/EventDispatcherTest.php index 2e6e380a..35d902ce 100644 --- a/test/Event/EventDispatcherTest.php +++ b/test/Event/EventDispatcherTest.php @@ -82,4 +82,19 @@ public function testVerifyReturnIsSkippedIfNotInstanceOfResult() $this->assertEquals([], iterator_to_array($this->results)); } + + public function testListenWithMultipleEvents() + { + $e1 = new Event('some-event', ['arg1' => 1, 'arg2' => 2]); + $e2 = new Event('some-event', ['arg1' => 1, 'arg2' => 2]); + $mockCallback1 = $this->getMock('stdClass', ['callback']); + $mockCallback1->expects($this->exactly(2)) + ->method('callback') + ->withConsecutive([$e1], [$e2]) + ->will($this->returnValue(true)); + + $this->eventDispatcher->listen(['some-event', 'second-event'], [$mockCallback1, 'callback']); + $this->eventDispatcher->dispatch($e1); + $this->eventDispatcher->dispatch($e2); + } }