error($e); } continue; } $responses[] = $response; if ($halt && !is_null($response)) { return $response; } if ($response === false) { break; } } return $halt ? null : $responses; } /** * @param mixed $event_name * @param mixed $data * @param bool $halt * @return array|null|mixed */ public static function dispatch($event_name, $data, bool $halt = false) { $listeners = static::getListeners($event_name); $responses = []; foreach ($listeners as $listener) { $response = $listener($data, $event_name); $responses[] = $response; if ($halt && !is_null($response)) { return $response; } if ($response === false) { break; } } return $halt ? null : $responses; } /** * @return array */ public static function list(): array { $listeners = []; foreach (static::$eventMap as $event_name => $callback_items) { foreach ($callback_items as $id => $callback_item) { $listeners[$id] = [$event_name, $callback_item]; } } foreach (static::$prefixEventMap as $event_name => $callback_items) { foreach ($callback_items as $id => $callback_item) { $listeners[$id] = [$event_name . '*', $callback_item]; } } ksort($listeners); return $listeners; } /** * @param mixed $event_name * @return callable[] */ public static function getListeners($event_name): array { $listeners = static::$eventMap[$event_name] ?? []; foreach (static::$prefixEventMap as $name => $callback_items) { if (strpos($event_name, $name) === 0) { $listeners = array_merge($listeners, $callback_items); } } ksort($listeners); return $listeners; } /** * @param mixed $event_name * @return bool */ public static function hasListener($event_name): bool { return !empty(static::getListeners($event_name)); } }