CakeEventManager::dispatch PHP Method

dispatch() public method

Dispatches a new event to all configured listeners
public dispatch ( string | CakeEvent $event ) : CakeEvent
$event string | CakeEvent the event key name or instance of CakeEvent
return CakeEvent
    public function dispatch($event)
    {
        if (is_string($event)) {
            $event = new CakeEvent($event);
        }
        $listeners = $this->listeners($event->name());
        if (empty($listeners)) {
            return $event;
        }
        foreach ($listeners as $listener) {
            if ($event->isStopped()) {
                break;
            }
            if ($listener['passParams'] === true) {
                $result = call_user_func_array($listener['callable'], $event->data);
            } else {
                $result = call_user_func($listener['callable'], $event);
            }
            if ($result === false) {
                $event->stopPropagation();
            }
            // CUSTOMIZE ADD 2013/09/23 ryuring
            // ObjectCollection を継承しているイベントの場合、
            // 複数のオブジェクトに対するイベントの結果が配列で返ってくるが、
            // 全ての結果がNULLの場合、その前のイベントの結果が上書きされてしまう。
            // 全ての結果がNULLの場合には、結果がNULLとみなし、上書きしない仕様に変更した
            // >>>
            if (is_array($result) && array_key_exists(0, $result)) {
                $notNull = false;
                foreach ($result as $key => $val) {
                    if ($val !== null) {
                        $notNull = true;
                    }
                }
                if (!$notNull) {
                    $result = null;
                }
            }
            // <<<
            if ($result !== null) {
                $event->result = $result;
            }
        }
        return $event;
    }

Usage Example

 public function work(GearmanJob $job)
 {
     $workload = $job->workload();
     $json = json_decode($workload, true);
     if (!json_last_error()) {
         $workload = $json;
     }
     $eventManager = new CakeEventManager();
     $eventManager->dispatch(new CakeEvent('Gearman.beforeWork', $this, $workload));
     $data = call_user_func($this->_workers[$job->functionName()], $job, $workload);
     $eventManager->dispatch(new CakeEvent('Gearman.afterWork', $this, $workload));
     return $data;
 }
All Usage Examples Of CakeEventManager::dispatch