/** * 处理请求 * * $request->execute(); * * @param Request $request * @param Response $response * @return \tourze\Http\Response * @throws \tourze\Base\Exception\BaseException */ public function executeRequest(Request $request, Response $response) { $className = 'Controller'; // 控制器 $controller = $request->controller; $className = Inflector::classify($controller) . $className; // 目录 $directory = $request->directory; if ($directory) { $directory = str_replace('/', '\\', $directory); $className = $directory . $className; } // 保存请求状态 $previous = Request::$current; Request::$current = $request; Base::getLog()->info(__METHOD__ . ' controller class', ['class' => $className]); try { if (!class_exists($className)) { Base::getLog()->debug(__METHOD__ . ' class not found', ['class' => $className]); throw HttpException::factory(Http::NOT_FOUND, 'The requested URL :uri was not found on this server.', [':uri' => $request->uri])->request($request); } $class = new ReflectionClass($className); if ($class->isAbstract()) { Base::getLog()->error(__METHOD__ . ' calling abstract controller class', ['class' => $className]); throw new BaseException('Cannot create instances of abstract :controller', [':controller' => $className]); } $controller = $class->newInstance(['request' => $request, 'response' => $response]); $response = $class->getMethod('execute')->invoke($controller); if (!$response instanceof Response) { Base::getLog()->error(__METHOD__ . ' unknown response type'); throw new BaseException('Controller failed to return a Response'); } } catch (HttpException $e) { if (null === $e->request()) { $e->request($request); } $response = $e->getResponse(); } Request::$current = $previous; return $response; }
/** * 执行请求 * * @return Response * @throws HttpException * @throws ClientRecursionException * @throws RequestException */ public function execute() { if (!$this->external) { Base::getLog()->debug(__METHOD__ . ' execute internal request'); $processed = Request::process($this, $this->routes); if ($processed) { // 保存匹配到的路由 $this->route = Arr::get($processed, 'route'); $params = Arr::get($processed, 'params'); // 是否为外部链接 $this->external = $this->route->isExternal(); // 控制器放在子目录中的情况 if (isset($params['directory'])) { $this->directory = $params['directory']; } // 附加上命名空间 if (isset($params['namespace'])) { $this->directory = $params['namespace']; } // 命名空间处理 if (!$this->directory) { $this->directory = Route::$defaultNamespace; } // 修正命名空间 if (false === strpos($this->directory, '\\')) { $this->directory = Route::$defaultNamespace . $this->directory . '\\'; } // 保存控制器 $this->controller = Arr::get($params, 'controller'); // 保存动作 $this->action = Arr::get($params, 'action', Route::$defaultAction); // 清理保留字段 foreach ($this->persistRouteParams as $name) { unset($params[$name]); } $this->_params = $params; Base::getLog()->debug(__METHOD__ . ' execute info', ['directory' => $this->directory, 'controller' => $this->controller, 'action' => $this->action, 'params' => $this->_params]); } else { Base::getLog()->debug(__METHOD__ . ' not route matched'); } } if (!$this->route instanceof Entry) { $e = HttpException::factory(Http::NOT_FOUND, 'Unable to find a route to match the URI: :uri', [':uri' => $this->uri]); $e->request($this); throw $e; } if (!$this->client instanceof RequestClient) { throw new RequestException('Unable to execute :uri without a RequestClient', [':uri' => $this->uri]); } return $this->client->execute($this); }