Skip to content

Commit

Permalink
Add method to return array of listeners matching a pattern
Browse files Browse the repository at this point in the history
Fix ticket 4192
  • Loading branch information
jeffblack360 committed Jan 25, 2016
1 parent a023c2d commit 6411db0
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 0 deletions.
15 changes: 15 additions & 0 deletions src/Event/EventManager.php
Expand Up @@ -441,6 +441,21 @@ public function prioritisedListeners($eventKey)
return $this->_listeners[$eventKey];
}

/**
* Returns the listeners matching a specified pattern
*
* @param string $eventKeyPattern Pattern to match.
* @return array
*/
public function matchingListeners($eventKeyPattern)
{
$matchPattern = '/'. $eventKeyPattern .'/';
$matches = array_intersect_key($this->_listeners,
array_flip(preg_grep($matchPattern,
array_keys($this->_listeners), 0)));
return $matches;
}

/**
* Debug friendly object properties.
*
Expand Down
61 changes: 61 additions & 0 deletions tests/TestCase/Event/EventManagerTest.php
Expand Up @@ -151,6 +151,67 @@ public function testAttachMultipleEventKeys()
$this->assertEquals($expected, $manager->listeners('another.event'));
}

/**
* Tests attached event listeners for matching key pattern
*
* @return void
*/
public function testMatchingListeners()
{
$manager = new EventManager();
$manager->attach('fakeFunction1', 'fake.event');
$manager->attach('fakeFunction2', 'real.event');
$manager->attach('fakeFunction3', 'test.event');
$manager->attach('fakeFunction4', 'event.test');

$this->assertArrayHasKey('fake.event', $manager->matchingListeners('fake'));
$this->assertArrayHasKey('real.event', $manager->matchingListeners('real'));
$this->assertArrayHasKey('test.event', $manager->matchingListeners('test'));
$this->assertArrayHasKey('event.test', $manager->matchingListeners('test'));
$this->assertArrayHasKey('test.event', $manager->matchingListeners('^test'));
$this->assertArrayHasKey('event.test', $manager->matchingListeners('test$'));

$expected = ['fake.event', 'real.event', 'test.event', 'event.test'];
$result = $manager->matchingListeners('event');
$this->assertNotEmpty($result);
$this->assertSame($expected, array_keys($result));

$expected = ['fake.event', 'real.event', 'test.event'];
$result = $manager->matchingListeners('.event');
$this->assertNotEmpty($result);
$this->assertSame($expected, array_keys($result));

$expected = ['test.event', 'event.test'];
$result = $manager->matchingListeners('test');
$this->assertNotEmpty($result);
$this->assertSame($expected, array_keys($result));

$expected = ['test.event'];
$result = $manager->matchingListeners('test.');
$this->assertNotEmpty($result);
$this->assertSame($expected, array_keys($result));

$expected = ['test.event'];
$result = $manager->matchingListeners('^test');
$this->assertNotEmpty($result);
$this->assertSame($expected, array_keys($result));

$expected = ['event.test'];
$result = $manager->matchingListeners('^event');
$this->assertNotEmpty($result);
$this->assertSame($expected, array_keys($result));

$expected = ['event.test'];
$result = $manager->matchingListeners('test$');
$this->assertNotEmpty($result);
$this->assertSame($expected, array_keys($result));

$expected = [];
$result = $manager->matchingListeners('foo');
$this->assertEmpty($manager->matchingListeners('foo'));
$this->assertSame($expected, array_keys($result));
}

/**
* Test the on() method for basic callable types.
*
Expand Down

0 comments on commit 6411db0

Please sign in to comment.