| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 | 
							- <?php
 
- // +----------------------------------------------------------------------
 
- // | ThinkPHP [ WE CAN DO IT JUST THINK ]
 
- // +----------------------------------------------------------------------
 
- // | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
 
- // +----------------------------------------------------------------------
 
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
 
- // +----------------------------------------------------------------------
 
- // | Author: liu21st <liu21st@gmail.com>
 
- // +----------------------------------------------------------------------
 
- namespace think;
 
- use think\response\Json as JsonResponse;
 
- use think\response\Jsonp as JsonpResponse;
 
- use think\response\Redirect as RedirectResponse;
 
- use think\response\View as ViewResponse;
 
- use think\response\Xml as XmlResponse;
 
- class Response
 
- {
 
-     // 原始数据
 
-     protected $data;
 
-     // 当前的contentType
 
-     protected $contentType = 'text/html';
 
-     // 字符集
 
-     protected $charset = 'utf-8';
 
-     //状态
 
-     protected $code = 200;
 
-     // 输出参数
 
-     protected $options = [];
 
-     // header参数
 
-     protected $header = [];
 
-     protected $content = null;
 
-     /**
 
-      * 构造函数
 
-      * @access   public
 
-      * @param mixed $data    输出数据
 
-      * @param int   $code
 
-      * @param array $header
 
-      * @param array $options 输出参数
 
-      */
 
-     public function __construct($data = '', $code = 200, array $header = [], $options = [])
 
-     {
 
-         $this->data($data);
 
-         if (!empty($options)) {
 
-             $this->options = array_merge($this->options, $options);
 
-         }
 
-         $this->contentType($this->contentType, $this->charset);
 
-         $this->header = array_merge($this->header, $header);
 
-         $this->code   = $code;
 
-     }
 
-     /**
 
-      * 创建Response对象
 
-      * @access public
 
-      * @param mixed  $data    输出数据
 
-      * @param string $type    输出类型
 
-      * @param int    $code
 
-      * @param array  $header
 
-      * @param array  $options 输出参数
 
-      * @return Response|JsonResponse|ViewResponse|XmlResponse|RedirectResponse|JsonpResponse
 
-      */
 
-     public static function create($data = '', $type = '', $code = 200, array $header = [], $options = [])
 
-     {
 
-         $class = false !== strpos($type, '\\') ? $type : '\\think\\response\\' . ucfirst(strtolower($type));
 
-         if (class_exists($class)) {
 
-             $response = new $class($data, $code, $header, $options);
 
-         } else {
 
-             $response = new static($data, $code, $header, $options);
 
-         }
 
-         return $response;
 
-     }
 
-     /**
 
-      * 发送数据到客户端
 
-      * @access public
 
-      * @return mixed
 
-      * @throws \InvalidArgumentException
 
-      */
 
-     public function send()
 
-     {
 
-         // 监听response_send
 
-         Hook::listen('response_send', $this);
 
-         // 处理输出数据
 
-         $data = $this->getContent();
 
-         // Trace调试注入
 
-         if (Env::get('app_trace', Config::get('app_trace'))) {
 
-             Debug::inject($this, $data);
 
-         }
 
-         if (200 == $this->code) {
 
-             $cache = Request::instance()->getCache();
 
-             if ($cache) {
 
-                 $this->header['Cache-Control'] = 'max-age=' . $cache[1] . ',must-revalidate';
 
-                 $this->header['Last-Modified'] = gmdate('D, d M Y H:i:s') . ' GMT';
 
-                 $this->header['Expires']       = gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME'] + $cache[1]) . ' GMT';
 
-                 Cache::tag($cache[2])->set($cache[0], [$data, $this->header], $cache[1]);
 
-             }
 
-         }
 
-         if (!headers_sent() && !empty($this->header)) {
 
-             // 发送状态码
 
-             http_response_code($this->code);
 
-             // 发送头部信息
 
-             foreach ($this->header as $name => $val) {
 
-                 if (is_null($val)) {
 
-                     header($name);
 
-                 } else {
 
-                     header($name . ':' . $val);
 
-                 }
 
-             }
 
-         }
 
-         echo $data;
 
-         if (function_exists('fastcgi_finish_request')) {
 
-             // 提高页面响应
 
-             fastcgi_finish_request();
 
-         }
 
-         // 监听response_end
 
-         Hook::listen('response_end', $this);
 
-         // 清空当次请求有效的数据
 
-         if (!($this instanceof RedirectResponse)) {
 
-             Session::flush();
 
-         }
 
-     }
 
-     /**
 
-      * 处理数据
 
-      * @access protected
 
-      * @param mixed $data 要处理的数据
 
-      * @return mixed
 
-      */
 
-     protected function output($data)
 
-     {
 
-         return $data;
 
-     }
 
-     /**
 
-      * 输出的参数
 
-      * @access public
 
-      * @param mixed $options 输出参数
 
-      * @return $this
 
-      */
 
-     public function options($options = [])
 
-     {
 
-         $this->options = array_merge($this->options, $options);
 
-         return $this;
 
-     }
 
-     /**
 
-      * 输出数据设置
 
-      * @access public
 
-      * @param mixed $data 输出数据
 
-      * @return $this
 
-      */
 
-     public function data($data)
 
-     {
 
-         $this->data = $data;
 
-         return $this;
 
-     }
 
-     /**
 
-      * 设置响应头
 
-      * @access public
 
-      * @param string|array $name  参数名
 
-      * @param string       $value 参数值
 
-      * @return $this
 
-      */
 
-     public function header($name, $value = null)
 
-     {
 
-         if (is_array($name)) {
 
-             $this->header = array_merge($this->header, $name);
 
-         } else {
 
-             $this->header[$name] = $value;
 
-         }
 
-         return $this;
 
-     }
 
-     /**
 
-      * 设置页面输出内容
 
-      * @param $content
 
-      * @return $this
 
-      */
 
-     public function content($content)
 
-     {
 
-         if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable([
 
-             $content,
 
-             '__toString',
 
-         ])
 
-         ) {
 
-             throw new \InvalidArgumentException(sprintf('variable type error: %s', gettype($content)));
 
-         }
 
-         $this->content = (string) $content;
 
-         return $this;
 
-     }
 
-     /**
 
-      * 发送HTTP状态
 
-      * @param integer $code 状态码
 
-      * @return $this
 
-      */
 
-     public function code($code)
 
-     {
 
-         $this->code = $code;
 
-         return $this;
 
-     }
 
-     /**
 
-      * LastModified
 
-      * @param string $time
 
-      * @return $this
 
-      */
 
-     public function lastModified($time)
 
-     {
 
-         $this->header['Last-Modified'] = $time;
 
-         return $this;
 
-     }
 
-     /**
 
-      * Expires
 
-      * @param string $time
 
-      * @return $this
 
-      */
 
-     public function expires($time)
 
-     {
 
-         $this->header['Expires'] = $time;
 
-         return $this;
 
-     }
 
-     /**
 
-      * ETag
 
-      * @param string $eTag
 
-      * @return $this
 
-      */
 
-     public function eTag($eTag)
 
-     {
 
-         $this->header['ETag'] = $eTag;
 
-         return $this;
 
-     }
 
-     /**
 
-      * 页面缓存控制
 
-      * @param string $cache 状态码
 
-      * @return $this
 
-      */
 
-     public function cacheControl($cache)
 
-     {
 
-         $this->header['Cache-control'] = $cache;
 
-         return $this;
 
-     }
 
-     /**
 
-      * 页面输出类型
 
-      * @param string $contentType 输出类型
 
-      * @param string $charset     输出编码
 
-      * @return $this
 
-      */
 
-     public function contentType($contentType, $charset = 'utf-8')
 
-     {
 
-         $this->header['Content-Type'] = $contentType . '; charset=' . $charset;
 
-         return $this;
 
-     }
 
-     /**
 
-      * 获取头部信息
 
-      * @param string $name 头部名称
 
-      * @return mixed
 
-      */
 
-     public function getHeader($name = '')
 
-     {
 
-         if (!empty($name)) {
 
-             return isset($this->header[$name]) ? $this->header[$name] : null;
 
-         } else {
 
-             return $this->header;
 
-         }
 
-     }
 
-     /**
 
-      * 获取原始数据
 
-      * @return mixed
 
-      */
 
-     public function getData()
 
-     {
 
-         return $this->data;
 
-     }
 
-     /**
 
-      * 获取输出数据
 
-      * @return mixed
 
-      */
 
-     public function getContent()
 
-     {
 
-         if (null == $this->content) {
 
-             $content = $this->output($this->data);
 
-             if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable([
 
-                 $content,
 
-                 '__toString',
 
-             ])
 
-             ) {
 
-                 throw new \InvalidArgumentException(sprintf('variable type error: %s', gettype($content)));
 
-             }
 
-             $this->content = (string) $content;
 
-         }
 
-         return $this->content;
 
-     }
 
-     /**
 
-      * 获取状态码
 
-      * @return integer
 
-      */
 
-     public function getCode()
 
-     {
 
-         return $this->code;
 
-     }
 
- }
 
 
  |