subscribes[$name] = $callback; $this->params[$name] = $params; return $this; } /** * @param $params * @param null $name * @return mixed|void * @throws Exception */ public function publish($name = null, $params = []) { if (empty($name)) { return $this->release_all($params); } if (!isset($this->subscribes[$name])) { throw new Exception('Subscribe ' . $name . ' not found.'); } $merge = $this->merge($name, $params); return $this->subscribes[$name](new Dtl($merge)); } /** * @param $params */ private function release_all($params) { foreach ($this->subscribes as $name => $subscribe) { $merge = $this->merge($this->params[$name] ?? [], $params); $subscribe(new Dtl($merge)); } } /** * @param $name * @param $params * @return mixed */ private function merge($name, $params) { if (!isset($this->params[$name])) { return $params; } return merge($this->params[$name], $params); } }