Browse Source

Merge pull request #4556 from robertpustulka/3.0-dispatch-event

3.0 Event: dispatchEvent() wrapper
ADmad 11 years ago
parent
commit
5f6bb95f94

+ 32 - 0
src/Event/EventManagerTrait.php

@@ -29,6 +29,13 @@ trait EventManagerTrait {
 	protected $_eventManager = null;
 
 /**
+ * Default class name for new event objects.
+ *
+ * @var string
+ */
+	protected $_eventClass = '\Cake\Event\Event';
+
+/**
  * Returns the Cake\Event\EventManager manager instance for this object.
  *
  * You can use this instance to register any new listeners or callbacks to the
@@ -46,4 +53,29 @@ trait EventManagerTrait {
 		return $this->_eventManager;
 	}
 
+/**
+ * Wrapper for creating and dispatching events. 
+ *
+ * Returns a dispatched event.
+ *
+ * @param string $name Name of the event.
+ * @param array $data Any value you wish to be transported with this event to
+ * it can be read by listeners.
+ *
+ * @param object $subject The object that this event applies to 
+ * ($this by default).
+ *
+ * @return \Cake\Event\Event
+ */
+	public function dispatchEvent($name, $data = null, $subject = null) {
+		if ($subject === null) {
+			$subject = $this;
+		}
+
+		$event = new $this->_eventClass($name, $subject, $data);
+		$this->eventManager()->dispatch($event);
+
+		return $event;
+	}
+
 }

+ 1 - 0
tests/TestCase/Error/DebuggerTest.php

@@ -368,6 +368,7 @@ object(Cake\View\View) {
 	[protected] _currentType => ''
 	[protected] _stack => []
 	[protected] _eventManager => object(Cake\Event\EventManager) {}
+	[protected] _eventClass => '\Cake\Event\Event'
 }
 TEXT;
 

+ 15 - 0
tests/TestCase/Event/EventManagerTraitTest.php

@@ -57,4 +57,19 @@ class EventManagerTraitTest extends TestCase {
 
 		$this->assertSame($eventManager, $this->subject->eventManager());
 	}
+
+/**
+ * testDispatchEvent
+ *
+ * @return void
+ */
+	public function testDispatchEvent() {
+
+		$event = $this->subject->dispatchEvent('some.event', ['foo' => 'bar']);
+
+		$this->assertInstanceOf('\Cake\Event\Event', $event);
+		$this->assertSame($this->subject, $event->subject);
+		$this->assertEquals('some.event', $event->name);
+		$this->assertEquals(['foo' => 'bar'], $event->data);
+	}
 }