/** * 执行外部请求,并返回接口 * * $request->execute(); * * @param Request $request * @param Response $response * @return Response * @throws Exception */ public function executeRequest(Request $request, Response $response) { $previous = Request::$current; Request::$current = $request; // 如果post数据了 if ($post = $request->post()) { $request->body = http_build_query($post, null, '&'); $request->headers('content-type', 'application/x-www-form-urlencoded; charset=' . $request->charset); } // 如果需要暴露框架信息 if (Base::$expose) { $request->headers('user-agent', Base::version()); } try { // 处理header $sendHeaders = []; if ($headers = $request->headers()) { foreach ($headers as $key => $value) { if (is_array($value)) { $value = implode(', ', $value); } $sendHeaders[$key] = $value; } } // 处理cookie if ($cookies = $request->cookie()) { $sendHeaders['Cookie'] = http_build_query($cookies, null, '; '); } $url = $request->uri; if ($query = $request->query()) { $url .= '?' . http_build_query($query, null, '&'); } // 执行请求 $result = Requests::request($url, $sendHeaders, $request->body, $request->method, $this->options); if (!$result->success) { throw new RequestException('Error fetching remote :url [ status :code ]', [':url' => $url, ':code' => $result->status_code]); } foreach ($result->headers as $k => $v) { $response->headers($k, $v); } $response->status = $result->status_code; $response->body = $result->body; } catch (Exception $e) { Request::$current = $previous; throw $e; } Request::$current = $previous; return $response; }
/** * 处理请求 * * $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; }