$event) { [$handler, $parameter] = $event; if ($handler !== $callback) { continue; } unset(static::$_events[$name][$index]); } } /** * @param $name * @return bool */ public static function offName($name): bool { if (!static::exists($name)) { return true; } unset(static::$_events[$name]); return static::exists($name); } /** * @param $name * @param null $callback * @return bool */ public static function exists($name, $callback = null): bool { if (!isset(static::$_events[$name])) { return false; } if ($callback === null) { return true; } foreach (static::$_events[$name] as $event) { [$handler, $parameter] = $event; if ($handler === $callback) { return true; } } return false; } /** * @param $name * @param $handler * @return mixed */ public static function get($name, $handler): mixed { if (!static::exists($name, $handler)) { return null; } if (empty($handler)) { return static::$_events[$name]; } foreach (static::$_events[$name] as $event) { [$callback, $parameter] = $event; if ($callback === $handler) { return [$event]; } } return null; } public static function clean() { static::$_events = []; } /** * @param $name * @param array $params * @param null $scope * @return bool * @throws Exception */ public function dispatch($name, array $params = [], $scope = null): bool { return static::trigger($name, $params, $scope); } /** * @param $name * @param null $parameter * @param null $handler * @param false $is_remove * @return bool * @throws Exception */ public static function trigger($name, $parameter = null, $handler = null, bool $is_remove = false): bool { $events = static::get($name, $handler); if (empty($events)) { return true; } foreach ($events as $event) { static::execute($event, $parameter); } if ($is_remove) { static::offName($name); } return true; } /** * @param $event * @param $parameter * @return bool * @throws Exception */ private static function execute($event, $parameter): bool { try { $meta = static::mergeParams($event[1], $parameter); if (call_user_func($event[0], ...$meta) === false) { return false; } return true; } catch (\Throwable $throwable) { return logger()->addError($throwable,'throwable'); } } /** * @param $defaultParameter * @param array $parameter * @return array */ private static function mergeParams($defaultParameter, array $parameter = []): array { if (empty($defaultParameter)) { $defaultParameter = $parameter; } else { if (!is_array($parameter)) { $parameter = []; } foreach ($parameter as $key => $value) { $defaultParameter[] = $value; } } if (!is_array($defaultParameter)) { $defaultParameter = [$defaultParameter]; } return $defaultParameter; } }