Browse Source

Merge pull request #8104 from jeffblack360/ticket-4192

Add method to return array of listeners matching a pattern.

Fixes #4192
Mark Story 10 years ago
parent
commit
4bb343d2d2
2 changed files with 87 additions and 0 deletions
  1. 18 0
      src/Event/EventManager.php
  2. 69 0
      tests/TestCase/Event/EventManagerTest.php

+ 18 - 0
src/Event/EventManager.php

@@ -443,6 +443,24 @@ class EventManager
     }
 
     /**
+     * Returns the listeners matching a specified pattern
+     *
+     * @param string $eventKeyPattern Pattern to match.
+     * @return array
+     */
+    public function matchingListeners($eventKeyPattern)
+    {
+        $matchPattern = '/' . preg_quote($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

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

@@ -152,6 +152,75 @@ 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.event'));
+        $this->assertArrayHasKey('real.event', $manager->matchingListeners('real.event'));
+        $this->assertArrayHasKey('test.event', $manager->matchingListeners('test.event'));
+        $this->assertArrayHasKey('event.test', $manager->matchingListeners('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('fake.event', $manager->matchingListeners('event'));
+        $this->assertArrayHasKey('real.event', $manager->matchingListeners('event'));
+        $this->assertArrayHasKey('test.event', $manager->matchingListeners('event'));
+        $this->assertArrayHasKey('event.test', $manager->matchingListeners('event'));
+        $this->assertArrayHasKey('fake.event', $manager->matchingListeners('.event'));
+        $this->assertArrayHasKey('real.event', $manager->matchingListeners('.event'));
+        $this->assertArrayHasKey('test.event', $manager->matchingListeners('.event'));
+        $this->assertArrayHasKey('test.event', $manager->matchingListeners('test.'));
+        $this->assertArrayHasKey('event.test', $manager->matchingListeners('.test'));
+
+        $this->assertEmpty($manager->matchingListeners('/test'));
+        $this->assertEmpty($manager->matchingListeners('test/'));
+        $this->assertEmpty($manager->matchingListeners('/test/'));
+        $this->assertEmpty($manager->matchingListeners('test$'));
+        $this->assertEmpty($manager->matchingListeners('ev.nt'));
+        $this->assertEmpty($manager->matchingListeners('^test'));
+        $this->assertEmpty($manager->matchingListeners('^event'));
+        $this->assertEmpty($manager->matchingListeners('*event'));
+        $this->assertEmpty($manager->matchingListeners('event*'));
+        $this->assertEmpty($manager->matchingListeners('foo'));
+
+        $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 = ['event.test'];
+        $result = $manager->matchingListeners('.test');
+        $this->assertNotEmpty($result);
+        $this->assertSame($expected, array_keys($result));
+    }
+
+    /**
      * Test the on() method for basic callable types.
      *
      * @return void