_events[$name])) { $this->_events[$name] = []; } if ($callback instanceof \Closure) { $callback = \Closure::bind($callback, Snowflake::app()); } else if (is_array($callback) && is_string($callback[0])) { if (!class_exists($callback[0])) { throw new Exception('Undefined callback class.'); } $callback[0] = Snowflake::createObject($callback[0]); } if ($this->exists($name, $callback)) { return; } if (!empty($this->_events[$name]) && $isAppend === true) { array_unshift($this->_events[$name], [$callback, $parameter]); } else { $this->_events[$name][] = [$callback, $parameter]; } } /** * @param $name * @param $callback */ public function of($name, $callback) { if (!isset($this->_events[$name])) { return; } foreach ($this->_events[$name] as $index => $event) { [$handler, $parameter] = $event; if ($handler !== $callback) { continue; } unset($this->_events[$name][$index]); } } /** * @param $name * @return bool */ public function offName($name) { if (!$this->exists($name)) { return true; } unset($this->_events[$name]); return $this->exists($name); } /** * @param $name * @param null $callback * @return bool */ public function exists($name, $callback = null) { if (!isset($this->_events[$name])) { return false; } if ($callback === null) { return true; } foreach ($this->_events[$name] as $event) { [$handler, $parameter] = $event; if ($handler === $callback) { return true; } } return false; } /** * @param $name * @param $handler * @return mixed|null */ public function get($name, $handler) { if (!$this->exists($name)) { return null; } foreach ($this->_events[$name] as $event) { [$callback, $parameter] = $event; if ($callback === $handler) { return $event; } } return null; } public function clean() { $this->_events = []; } /** * @param $name * @param null $handler * @param null $parameter * @param false $is_remove * @return bool|mixed * @throws Exception */ public function trigger($name, $parameter = null, $handler = null, $is_remove = false) { if (!$this->exists($name)) { return false; } if (!empty($handler) && $this->exists($name, $handler)) { [$handler, $defaultParameter] = $this->get($name, $handler); if (!empty($parameter)) { $defaultParameter = ArrayAccess::merge($defaultParameter, $parameter); } if (!is_array($defaultParameter)) { $defaultParameter = [$defaultParameter]; } $result = call_user_func($handler, ...$defaultParameter); if ($is_remove) { $this->of($name, $handler); } return $result; } foreach ($this->_events[$name] as $event) { [$handler, $defaultParameter] = $event; try { if (!empty($parameter)) { $defaultParameter = ArrayAccess::merge($defaultParameter, $parameter); } if (!is_array($defaultParameter)) { $defaultParameter = [$defaultParameter]; } call_user_func($handler, ...$defaultParameter); } catch (\Throwable $exception) { $this->error($exception->getMessage()); } } if ($is_remove) { $this->offName($name); } return true; } }