Browse Source

Add method to return array of listeners matching a pattern

Fix ticket 4192
jeffblack360 10 years ago
parent
commit
6411db0c65
2 changed files with 76 additions and 0 deletions
  1. 15 0
      src/Event/EventManager.php
  2. 61 0
      tests/TestCase/Event/EventManagerTest.php

+ 15 - 0
src/Event/EventManager.php

@@ -442,6 +442,21 @@ class EventManager
     }
 
     /**
+     * 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.
      *
      * @return array

+ 61 - 0
tests/TestCase/Event/EventManagerTest.php

@@ -152,6 +152,67 @@ class EventManagerTest extends TestCase
     }
 
     /**
+     * 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.
      *
      * @return void