Browse Source

Merge pull request #9334 from jeremyharris/global-event-lists

Tracking events on global list
Mark Story 9 years ago
parent
commit
cc1cbdb914
2 changed files with 67 additions and 8 deletions
  1. 19 8
      src/Event/EventManager.php
  2. 48 0
      tests/TestCase/Event/EventManagerTest.php

+ 19 - 8
src/Event/EventManager.php

@@ -371,11 +371,16 @@ class EventManager
         }
 
         $listeners = $this->listeners($event->name());
-        if (empty($listeners)) {
-            if ($this->_trackEvents) {
-                $this->addEventToList($event);
-            }
 
+        if ($this->_trackEvents) {
+            $this->addEventToList($event);
+        }
+
+        if (!$this->_isGlobal && static::instance()->isTrackingEvents()) {
+            static::instance()->addEventToList($event);
+        }
+
+        if (empty($listeners)) {
             return $event;
         }
 
@@ -392,10 +397,6 @@ class EventManager
             }
         }
 
-        if ($this->_trackEvents) {
-            $this->addEventToList($event);
-        }
-
         return $event;
     }
 
@@ -534,6 +535,16 @@ class EventManager
     }
 
     /**
+     * Returns whether this manager is set up to track events
+     *
+     * @return bool
+     */
+    public function isTrackingEvents()
+    {
+        return $this->_trackEvents && $this->_eventList;
+    }
+
+    /**
      * Enables the listing of dispatched events.
      *
      * @param \Cake\Event\EventList $eventList The event list object to use.

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

@@ -760,4 +760,52 @@ class EventManagerTest extends TestCase
         $result = $manager->getEventList();
         $this->assertNull($result);
     }
+
+    /**
+     * Test that locally dispatched events are also added to the global manager's event list
+     *
+     * @return void
+     * @triggers Event $this
+     */
+    public function testGetLocallyDispatchedEventsFromGlobal()
+    {
+        $localList = new EventList();
+        $globalList = new EventList();
+
+        $globalManager = EventManager::instance();
+        $globalManager->setEventList($globalList);
+
+        $localManager = new EventManager();
+        $localManager->setEventList($localList);
+
+        $globalEvent = new Event('GlobalEvent', $this);
+        $globalManager->dispatch($globalEvent);
+
+        $localEvent = new Event('LocalEvent', $this);
+        $localManager->dispatch($localEvent);
+
+        $this->assertTrue($globalList->hasEvent('GlobalEvent'));
+        $this->assertFalse($localList->hasEvent('GlobalEvent'));
+        $this->assertTrue($localList->hasEvent('LocalEvent'));
+        $this->assertTrue($globalList->hasEvent('LocalEvent'));
+    }
+
+    /**
+     * Test isTrackingEvents
+     *
+     * @return void
+     */
+    public function testIsTrackingEvents()
+    {
+        $this->assertFalse(EventManager::instance()->isTrackingEvents());
+
+        $manager = new EventManager();
+        $manager->setEventList(new EventList());
+
+        $this->assertTrue($manager->isTrackingEvents());
+
+        $manager->trackEvents(false);
+
+        $this->assertFalse($manager->isTrackingEvents());
+    }
 }