$v) { if (empty($v) && $k === 0) { continue; } if (empty($v) && $k === count($exp) - 1) { $subject .= '^EOL'; $v = '^EOL'; } $cur_var = ''; $ori = $i; while (($a = mb_substr($subject, $i, mb_strlen($v))) !== $v && !empty($a)) { $cur_var .= mb_substr($subject, $i, 1); ++$i; } if ($i !== $ori || $k === 1 || $k === count($exp) - 1) { $result[] = $cur_var; } $i += mb_strlen($v); } return $result; } return false; } /** * 构建消息段的助手函数 * * @param string $type 类型 * @param array $data 字段 */ function segment(string $type, array $data = []): MessageSegment { return new MessageSegment($type, $data); } /** * 中间件操作类的助手函数 */ function middleware(): MiddlewareHandler { return MiddlewareHandler::getInstance(); } // ////////////////// 容器部分 ////////////////////// /** * 获取容器实例 */ function container(): DI\Container { return ContainerHolder::getEventContainer(); } /** * 解析类实例(使用容器) * * 这是 {@see container()}->make($abstract, $parameters) 的别名 * * @template T * @param class-string $abstract * @return Closure|mixed|T */ function resolve(string $abstract, array $parameters = []) { /* @noinspection PhpUnhandledExceptionInspection */ return container()->make($abstract, $parameters); } /** * 获取 MySQL 调用的类 * * @throws DBException */ function db(string $name = '') { return new DBWrapper($name); } /** * 获取构建 MySQL 的类 * * @throws DBException */ function sql_builder(string $name = ''): DBQueryBuilder { return (new DBWrapper($name))->createQueryBuilder(); } /** * 获取 Redis 操作类 * * @param string $name 使用的 Redis 连接名称 */ function redis(string $name = 'default'): RedisWrapper { return new RedisWrapper($name); } /** * 获取 / 设置配置项 * * 传入键名和(或)默认值,获取配置项 * 传入数组,设置配置项 * 不传参数,返回配置容器 * * @param null|array|string $key 键名 * @param null|mixed $default 默认值 * @return mixed|void|ZMConfig */ function config(array|string $key = null, mixed $default = null) { $config = ZMConfig::getInstance(); if (is_null($key)) { return $config; } if (is_array($key)) { $config->set($key); return; } return $config->get($key, $default); } function bot(string $bot_id = '', string $platform = ''): ZM\Context\BotContext { return BotMap::getBotContext($bot_id, $platform); } function bot_connect(int $flag, int $fd) { return BotMap::getConnectContext($flag, $fd); } /** * 获取一个 KV 库实例 * * @param string $name KV 库名称 * @return CacheInterface */ function kv(string $name = ''): Psr\SimpleCache\CacheInterface { global $kv_class; if (!$kv_class) { $kv_class = config('global.kv.use', LightCache::class); } /* @phpstan-ignore-next-line */ return is_a($kv_class, KVInterface::class, true) ? $kv_class::open($name) : new $kv_class($name); } /** * 获取环境变量 */ function env(string $key, mixed $default = null): mixed { // TODO: 重新思考容器绑定的加载方式,从而在此处使用 interface return resolve(Environment::class)->get($key, $default); } /** * 【助手函数】HttpFactory 快速创建一个 Response * * @param int $status_code 状态码 * @param null|string $reason 原因(留空则使用状态码本身的) * @param array $headers 请求头 * @param mixed $body HTTP Body * @param string $protocol HTTP 协议版本 */ function zm_http_response(int $status_code = 200, ?string $reason = null, array $headers = [], mixed $body = null, string $protocol = '1.1'): ResponseInterface { return HttpFactory::createResponse($status_code, $reason, $headers, $body, $protocol); } /** * 【助手函数】获取驱动的 WebSocket 服务器对应 Socket 操作对象 * * @param int $flag 对应的 Server 端口标记 * @throws Exception */ function ws_socket(int $flag = 1): WSServerSocketBase { $a = Framework::getInstance()->getDriver()->getWSServerSocketByFlag($flag); if ($a === null) { throw new Exception('找不到目标的 server socket,请检查 flag 值'); } return $a; } /** * 创建炸毛框架应用 */ function zm_create_app(): ZMApplication { return new ZMApplication(); } /** * 创建炸毛框架的插件对象 */ function zm_create_plugin(): ZMPlugin { return new ZMPlugin(); } /** * 创建一个 WebSocket 客户端 * * @param string $address 接入地址,例如 ws://192.168.1.3:9998/ * @param array $header 请求头 * @param null|mixed $set Swoole 驱动下传入的额外参数 * @throws DriverException * @throws ClientException */ function zm_websocket_client(string $address, array $header = [], mixed $set = null): WebSocketClientInterface { return match (Framework::getInstance()->getDriver()->getName()) { 'swoole' => \OneBot\Driver\Swoole\WebSocketClient::createFromAddress($address, $header, $set ?? ['websocket_mask' => true]), 'workerman' => WebSocketClient::createFromAddress($address, $header), default => throw new DriverException('current driver is not supported for creating websocket client'), }; }