$httpRequest->method(), 'path' => $httpRequest->path(), 'content_type' => $httpRequest->header('Content-Type'), 'request_unid' => RUN_UNIQID ]); // 创建响应对象 $response = new Response(); $response->setRunUnid(RUN_UNIQID); $startTime = microtime(true); $contentType = $httpRequest->header('Content-Type'); $callpath = ''; try { // 获取原始请求数据 $rawData = $httpRequest->getContent(); if (empty($rawData)) { throw new \Exception('Empty request data'); } // 解析请求数据 $request = new Request(); if (stripos($contentType, 'json') !== false) { // JSON 格式请求 $jsonData = json_decode($rawData, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new \Exception('Invalid JSON data: ' . json_last_error_msg()); } $request->mergeFromJsonString(json_encode($jsonData)); } else { // Protobuf 格式请求 $request->mergeFromString($rawData); } $requestLogger->setProtobufJson($request->serializeToJsonString()); // 获取路由配置 $config = config('proto_route'); if (empty($config['routes'])) { throw new \Exception('Proto route configuration not found'); } Logger::debug('router-proto',$config['routes']); // 查找匹配的请求 $result = $this->findValidRequest($request, $config['routes']); if (!$result) { throw new \Exception('No valid request found'); } // 处理请求 ['field' => $field, 'method' => $method, 'data' => $data] = $result; $moduleName = ucfirst($field); $methodName = Str::studly($method); // 构造处理器类名和响应类名 $handlerClass = "App\\Module\\AppGame\\Handler\\{$moduleName}\\{$methodName}Handler"; $responseMethodClass = "Uraus\\Kku\\Response\\Response{$moduleName}{$methodName}"; $callpath = $moduleName.'-'.$methodName; // 检查类是否存在 if (!class_exists($handlerClass)) { throw new HandleNotException("Handler not found: {$handlerClass}"); } if (!class_exists($responseMethodClass)) { throw new HandleNotException("Response class not found: {$responseMethodClass}"); } Log::info('处理请求', [ 'module' => $moduleName, 'method' => $methodName, 'handler' => $handlerClass ]); // 执行处理器 $handler = new $handlerClass($response); // 将handler存入request以供中间件使用 $httpRequest->attributes->set('_handler', $handler); // 执行登录检查中间件 $middleware = new \App\Module\AppGame\Middleware\LoginCheck(); $middlewareResponse = $middleware->handle($httpRequest, function ($request) use ($handler, $data) { return $handler->handle($data); }); // 如果中间件返回了响应,说明验证未通过 if ($middlewareResponse instanceof \Illuminate\Http\Response || $middlewareResponse instanceof \Illuminate\Http\JsonResponse) { return $middlewareResponse; } $methodResponse = $middlewareResponse; // 验证返回值类型 if (!($methodResponse instanceof $responseMethodClass)) { throw new \Exception(sprintf( 'Handler must return instance of %s, %s given', $responseMethodClass, is_object($methodResponse) ? get_class($methodResponse) : gettype($methodResponse) )); } // 设置主响应 $setter = 'set' . ucfirst($field).ucfirst($method); $response->$setter($methodResponse); // 如果响应码未设置,则设置为 OK if ($response->getCode() === 0) { $response->setCode(RESPONSE_CODE::OK); } } catch (HandleNotException $e) { $errorMsg = $e->getMessage(); Log::error('请求处理发生异常-未找到', [ 'error' => $errorMsg, 'trace' => $e->getTraceAsString(), 'request_unid' => RUN_UNIQID ]); // 记录错误信息 $requestLogger->setError($errorMsg); $response->setCode(RESPONSE_CODE::HANDLE_NOT); } catch (ValidateException $e) { $errorMsg = $e->validation->firstError() ?? $e->getMessage(); Log::error('请求处理发生验证错误', [ 'error' => $errorMsg, 'trace' => $e->getTraceAsString(), 'request_unid' => RUN_UNIQID ]); // 记录错误信息 $requestLogger->setError($errorMsg); $response->setCode(RESPONSE_CODE::VALIDATE_ERROR); $response->setMsg($errorMsg); } catch (\Exception $e) { if(App::is_local()){ throw $e; } $errorMsg = $e->getMessage(); Log::error('请求处理发生异常', [ 'error' => $errorMsg, 'trace' => $e->getTraceAsString(), 'request_unid' => RUN_UNIQID ]); // 记录错误信息 $requestLogger->setError($errorMsg); $response->setCode(RESPONSE_CODE::SERVER_ERROR); } // 设置运行时间 $endTime = microtime(true); $runMs = intval(($endTime - $startTime) * 1000); $response->setRunMs($runMs); if($callpath){ $response->setCallpath($callpath); } // 更新请求日志记录响应信息 $requestLogger->setResponse($response); $requestLogger->setRunTime($startTime); return Protobuf::response($response); } /** * 查找有效的请求 * @param Request $request Protobuf 请求对象 * @param array $routes 路由配置 * @return array|null 返回模块名、方法名和数据,如果没有找到则返回 null */ protected function findValidRequest(Request $request, array $routes): ?array { foreach ($routes as $field => $methods) { $hasMethod = 'has' . ucfirst($field); $getMethod = 'get' . ucfirst($field); foreach ($methods as $action) { $actionName = Str::studly($action); $hasActionFunc = 'has' .ucfirst($field). $actionName; $getActionFunc = 'get' . ucfirst($field).$actionName; $request->hasHouseUp(); Logger::debug('', [$hasMethod, $getMethod, $hasActionFunc]); if ( $request->$hasActionFunc()) { return [ 'field' => $field, 'method' => $actionName, 'data' => $request->$getActionFunc() ]; } } } return null; } }