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;
}
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; }