public function trigger($event, array $args = array())
{
$event = strtolower($event);
$result = array();
// Make sure the event is known to us, otherwise return an empty array
if (!isset($this->events[$event]) || empty($this->events[$event])) {
return $result;
}
foreach ($this->events[$event] as $className) {
// Make sure the observer exists.
if (!isset($this->observers[$className])) {
continue;
}
// Get the observer
$observer = $this->observers[$className];
// Make sure the method exists
if (!method_exists($observer, $event)) {
continue;
}
// Call the event handler and add its output to the return value. The switch allows for execution up to 2x
// faster than using call_user_func_array
switch (count($args)) {
case 0:
$result[] = $observer->{$event}();
break;
case 1:
$result[] = $observer->{$event}($args[0]);
break;
case 2:
$result[] = $observer->{$event}($args[0], $args[1]);
break;
case 3:
$result[] = $observer->{$event}($args[0], $args[1], $args[2]);
break;
case 4:
$result[] = $observer->{$event}($args[0], $args[1], $args[2], $args[3]);
break;
case 5:
$result[] = $observer->{$event}($args[0], $args[1], $args[2], $args[3], $args[4]);
break;
default:
$result[] = call_user_func_array(array($observer, $event), $args);
break;
}
}
// Return the observers' result in an array
return $result;
}
/** * @covers FOF30\Event\Dispatcher::trigger */ public function testTrigger() { ReflectionHelper::setValue($this->object, 'observers', array()); ReflectionHelper::setValue($this->object, 'events', array()); $observer1 = new FirstObserver($this->object); $observer2 = new SecondObserver($this->object); // Trigger a non-existent event $result = $this->object->trigger('notthere'); $this->assertEquals(array(), $result); // Trigger a non-existent event with data $result = $this->object->trigger('notthere', array('whatever', 'nevermind')); $this->assertEquals(array(), $result); // Trigger an event with one observer responding to it $result = $this->object->trigger('onlySecond'); $this->assertEquals(array('only second'), $result); // Trigger an event with two observers responding to it $result = $this->object->trigger('identifyYourself'); $this->assertEquals(array('one', 'two'), $result); // Trigger an event with two observers responding to it, with parameters $result = $this->object->trigger('returnConditional', array('one')); $this->assertEquals(array(true, false), $result); // Trigger an event with two observers responding to it, with parameters $result = $this->object->trigger('returnConditional', array('two')); $this->assertEquals(array(false, true), $result); }