示例#1
0
 /**
  * 执行外部请求,并返回接口
  *
  *     $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;
 }
示例#2
0
 /**
  * 处理请求
  *
  *     $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;
 }