diff --git a/HttpServer/Server.php b/HttpServer/Server.php index f2fa26e3..006db4f4 100644 --- a/HttpServer/Server.php +++ b/HttpServer/Server.php @@ -450,11 +450,8 @@ class Server extends HttpService if (!in_array($config['type'], [self::HTTP, self::TCP, self::PACKAGE])) { throw new Exception('Unknown server type(' . $config['type'] . ').'); } - if (in_array($config['type'], $this->listenTypes)) { - return $this->swoole; - } - if ($config['type'] == self::HTTP) { - $this->onBind($newListener, 'request', [Snowflake::createObject(OnRequest::class), 'onHandler']); + if ($config['type'] == self::HTTP && !$this->swoole->getCallback('request')) { + $this->onBindCallback('request', [make(OnRequest::class), 'onHandler']); } else { $this->noHttp($newListener, $config); } @@ -467,40 +464,34 @@ class Server extends HttpService /** * @param $newListener * @param $config - * @throws NotFindClassException - * @throws ReflectionException * @throws Exception */ private function noHttp($newListener, $config) { - $this->onBind($newListener, 'connect', [Snowflake::createObject(OnConnect::class), 'onHandler']); - $this->onBind($newListener, 'close', [Snowflake::createObject(OnClose::class), 'onHandler']); + $this->onBindCallback('connect', [make(OnConnect::class), 'onHandler']); + $this->onBindCallback('close', [make(OnClose::class), 'onHandler']); if ($config['type'] == self::TCP) { - $this->onBind($newListener, 'receive', [$class = new OnReceive(), 'onHandler']); + $this->onBindCallback('receive', [make(OnReceive::class), 'onHandler']); } else { - $this->onBind($newListener, 'packet', [$class = new OnPacket(), 'onHandler']); + $this->onBindCallback('packet', [make(OnPacket::class), 'onHandler']); } - $class->host = $config['host']; - $class->port = $config['port']; } /** - * @param $server * @param $name * @param $callback * @throws Exception */ - private function onBind($server, $name, $callback) + public function onBindCallback($name, $callback) { - if (in_array($name, $this->listening)) { - return; - } - array_push($this->listening, $name); if ($name === 'request') { $this->onLoadHttpHandler(); } - $server->on($name, $callback); + if ($this->swoole->getCallback($name) !== null) { + return; + } + $this->swoole->on($name, $callback); } @@ -520,7 +511,7 @@ class Server extends HttpService $annotation->instanceDirectoryFiles(RPC_SERVICE_PATH); $annotation->instanceDirectoryFiles(RPC_CLIENT_PATH); } catch (\Throwable $exception) { - $this->addError($exception,'throwable'); + $this->addError($exception, 'throwable'); } }); } diff --git a/Rpc/Service.php b/Rpc/Service.php index 4d6b38ca..7ba2a89f 100644 --- a/Rpc/Service.php +++ b/Rpc/Service.php @@ -51,7 +51,7 @@ class Service extends Component } $this->debug(Snowflake::listen($service)); - $this->addCallback($server, $mode); + $this->addCallback($mode); $rpcServer = $server->addlistener($service['host'], $service['port'], $mode); $rpcServer->set($service['setting'] ?? [ @@ -76,28 +76,21 @@ class Service extends Component /** - * @param $server * @param $mode - * @throws ReflectionException - * @throws NotFindClassException * @throws Exception */ - private function addCallback($server, $mode) + private function addCallback($mode) { - $app = Snowflake::app()->getServer(); - $tcp = [SWOOLE_SOCK_TCP, SWOOLE_TCP, SWOOLE_TCP6, SWOOLE_SOCK_TCP6]; - if (in_array($mode, $tcp) && !$app->isListen(Server::TCP)) { - $server->on('connect', [Snowflake::createObject(OnConnect::class), 'onHandler']); - $server->on('close', [Snowflake::createObject(OnClose::class), 'onHandler']); - $server->on('receive', [$class = new OnReceive(), 'onHandler']); - } + $server = Snowflake::app()->getServer(); + $server->onBindCallback('connect', [make(OnConnect::class), 'onHandler']); + $server->onBindCallback('close', [make(OnClose::class), 'onHandler']); - if (in_array($mode, $tcp) || !$app->isListen(Server::PACKAGE)) { - $server->on('connect', [Snowflake::createObject(OnConnect::class), 'onHandler']); - $server->on('close', [Snowflake::createObject(OnClose::class), 'onHandler']); - $server->on('packet', [$class = new OnPacket(), 'onHandler']); + if (in_array($mode, $tcp)) { + $server->onBindCallback('receive', [make(OnReceive::class), 'onHandler']); + } else { + $server->onBindCallback('packet', [make(OnReceive::class), 'onHandler']); } } diff --git a/function.php b/function.php index 2cdb06ae..c085fcd1 100644 --- a/function.php +++ b/function.php @@ -33,16 +33,22 @@ if (!function_exists('make')) { * @return mixed * @throws */ - function make($name, $default): mixed + function make($name, $default = null): mixed { - if (Snowflake::has($name)) { - $class = Snowflake::app()->$name; - } else if (Snowflake::has($default)) { - $class = Snowflake::app()->$default; - } else { - $class = Snowflake::createObject($default); - Snowflake::setAlias($name, $default); + if (class_exists($name)) { + return Snowflake::createObject($default); } + if (Snowflake::has($name)) { + return Snowflake::app()->get($name); + } + if (empty($default)) { + throw new Exception("Unknown component ID: $name"); + } + if (Snowflake::has($default)) { + return Snowflake::app()->get($default); + } + $class = Snowflake::createObject($default); + class_alias($name, $default, true); return $class; }