diff --git a/library/think/Request.php b/library/think/Request.php new file mode 100644 index 00000000..f89a3a7d --- /dev/null +++ b/library/think/Request.php @@ -0,0 +1,450 @@ + +// +---------------------------------------------------------------------- + +namespace think; + +use think\Config; +use think\Input; + +class Request +{ + /** + * @var string 基础URL + */ + protected static $baseUrl; + + /** + * @var string 根目录 + */ + protected static $root; + + /** + * @var string pathinfo + */ + protected static $pathinfo; + + /** + * @var string pathinfo(不含后缀) + */ + protected static $path; + + /** + * @var string 路由 + */ + protected static $route; + + /** + * @var array 调度信息 + */ + protected static $dispatch = []; + + /** + * @var array 资源类型 + */ + protected static $mime = [ + 'html' => 'text/html,application/xhtml+xml,*/*', + 'xml' => 'application/xml,text/xml,application/x-xml', + 'json' => 'application/json,text/x-json,application/jsonrequest,text/json', + 'js' => 'text/javascript,application/javascript,application/x-javascript', + 'css' => 'text/css', + 'rss' => 'application/rss+xml', + 'yaml' => 'application/x-yaml,text/yaml', + 'atom' => 'application/atom+xml', + 'pdf' => 'application/pdf', + 'text' => 'text/plain', + 'png' => 'image/png', + 'jpg' => 'image/jpg,image/jpeg,image/pjpeg', + 'gif' => 'image/gif', + 'csv' => 'text/csv', + ]; + + /** + * 获取基础URL + * @access public + * @param string $url URL地址 + * @return string + */ + public static function baseUrl($url = '') + { + if (!empty($url)) { + self::$baseUrl = $url; + } else { + return self::$baseUrl ?: rtrim($_SERVER['SCRIPT_NAME'], '/'); + } + } + + /** + * 获取URL访问根目录 + * @access public + * @param string $url URL地址 + * @return string + */ + public static function root($url = '') + { + if (!empty($url)) { + self::$root = $url; + + } elseif (self::$root) { + return self::$root; + } else { + $_root = rtrim(dirname(self::baseUrl()), '/'); + return ('/' == $_root || '\\' == $_root) ? '' : $_root; + } + } + + /** + * 获取当前请求URL的pathinfo信息(含URL后缀) + * @access public + * @return string + */ + public static function pathinfo() + { + if (is_null(self::$pathinfo)) { + if (Config::get('var_pathinfo')) { + // 判断URL里面是否有兼容模式参数 + $_SERVER['PATH_INFO'] = $_GET[Config::get('var_pathinfo')]; + unset($_GET[Config::get('var_pathinfo')]); + } elseif (IS_CLI) { + // CLI模式下 index.php module/controller/action/params/... + $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ''; + } + + // 分析PATHINFO信息 + if (!isset($_SERVER['PATH_INFO'])) { + foreach (Config::get('pathinfo_fetch') as $type) { + if (!empty($_SERVER[$type])) { + $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ? + substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type]; + break; + } + } + } + self::$pathinfo = empty($_SERVER['PATH_INFO']) ? '/' : trim($_SERVER['PATH_INFO'], '/'); + } + return self::$pathinfo; + } + + /** + * 获取当前请求URL的pathinfo信息(不含URL后缀) + * @access public + * @return string + */ + public static function path() + { + if (is_null(self::$path)) { + // 去除正常的URL后缀 + self::$path = preg_replace(Config::get('url_html_suffix') ? '/\.(' . trim(Config::get('url_html_suffix'), '.') . ')$/i' : '/\.' . self::ext() . '$/i', '', self::pathinfo()); + } + return self::$path; + } + + /** + * 当前URL的访问后缀 + * @access public + * @return string + */ + public static function ext() + { + return pathinfo(self::pathinfo(), PATHINFO_EXTENSION); + } + + /** + * 获取当前请求的时间 + * @access public + * @param bool $float 是否使用浮点类型 + * @return integer|float + */ + public static function time($float = false) + { + return $float ? $_SERVER['REQUEST_TIME_FLOAT'] : $_SERVER['REQUEST_TIME']; + } + + /** + * 当前请求的资源类型 + * @access public + * @return false|string + */ + public static function type() + { + if (!isset($_SERVER['HTTP_ACCEPT'])) { + return false; + } + + foreach (self::$mimeType as $key => $val) { + $array = explode(',', $val); + foreach ($array as $k => $v) { + if (stristr($_SERVER['HTTP_ACCEPT'], $v)) { + return $key; + } + } + } + return false; + } + + /** + * 设置资源类型 + * @access public + * @param string|array $type 资源类型名 + * @param string $val 资源类型 + * @return void + */ + public static function mimeType($type, $val = '') + { + if (is_array($type)) { + + self::$mimeType = array_merge(self::$mimeType, $type); + } else { + self::$mimeType[$type] = $val; + } + } + + /** + * 当前的请求类型 + * @access public + * @return string + */ + public static function method() + { + return IS_CLI ? 'GET' : $_SERVER['REQUEST_METHOD']; + } + + /** + * 当前请求的参数 + * @access public + * @param string $name 变量名 + * @return mixed + */ + public static function param($name = '') + { + return Input::param($name); + } + + /** + * 当前请求的get参数 + * @access public + * @param string $name 变量名 + * @return mixed + */ + public static function get($name = '') + { + return Input::get($name); + } + + /** + * 当前请求的post参数 + * @access public + * @param string $name 变量名 + * @return mixed + */ + public static function post($name = '') + { + return Input::post($name); + } + + /** + * 当前请求的put参数 + * @access public + * @param string $name 变量名 + * @return mixed + */ + public static function put($name = '') + { + return Input::put($name); + } + + /** + * 当前请求的delete参数 + * @access public + * @param string $name 变量名 + * @return mixed + */ + public static function delete($name = '') + { + return Input::delete($name); + } + + /** + * 获取session数据 + * @access public + * @param string $name 变量名 + * @return mixed + */ + public static function session($name = '') + { + return Input::session($name); + } + + /** + * 获取cookie参数 + * @access public + * @param string $name 变量名 + * @return mixed + */ + public static function cookie($name = '') + { + return Input::cookie($name); + } + + /** + * 获取server参数 + * @access public + * @param string $name 变量名 + * @return mixed + */ + public static function server($name = '') + { + return Input::server($name); + } + + /** + * 获取上传的文件信息 + * @access public + * @param string $name 名称 + * @return null|array|\think\File + */ + public static function file($name = '') + { + return Input::file($name); + } + + /** + * 当前是否ssl + * @access public + * @return bool + */ + public static function isSsl() + { + if (isset($_SERVER['HTTPS']) && ('1' == $_SERVER['HTTPS'] || 'on' == strtolower($_SERVER['HTTPS']))) { + return true; + } elseif (isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'])) { + return true; + } + return false; + } + + /** + * 当前是否ajax请求 + * @access public + * @return bool + */ + public static function isAjax() + { + return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') ? true : false; + } + + /** + * 获取客户端IP地址 + * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 + * @param boolean $adv 是否进行高级模式获取(有可能被伪装) + * @return mixed + */ + public static function ip($type = 0, $adv = false) + { + $type = $type ? 1 : 0; + static $ip = null; + if (null !== $ip) { + return $ip[$type]; + } + + if ($adv) { + if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { + $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); + $pos = array_search('unknown', $arr); + if (false !== $pos) { + unset($arr[$pos]); + } + + $ip = trim($arr[0]); + } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { + $ip = $_SERVER['HTTP_CLIENT_IP']; + } elseif (isset($_SERVER['REMOTE_ADDR'])) { + $ip = $_SERVER['REMOTE_ADDR']; + } + } elseif (isset($_SERVER['REMOTE_ADDR'])) { + $ip = $_SERVER['REMOTE_ADDR']; + } + // IP地址合法验证 + $long = sprintf("%u", ip2long($ip)); + $ip = $long ? array($ip, $long) : array('0.0.0.0', 0); + return $ip[$type]; + } + + /** + * 当前URL地址中的scheme参数 + * @access public + * @return string + */ + public static function scheme() + { + return $_SERVER['REQUEST_SCHEME']; + } + + /** + * 当前请求URL地址中的query参数 + * @access public + * @return string + */ + public static function query() + { + return $_SERVER['QUERY_STRING']; + } + + /** + * 当前请求的host + * @access public + * @return string + */ + public static function host() + { + return $_SERVER['SERVER_NAME']; + } + + /** + * 当前请求URL地址中的port参数 + * @access public + * @return integer + */ + public static function port() + { + return $_SERVER['SERVER_PORT']; + } + + /** + * 获取当前请求的路由 + * @access public + * @param string $route 路由名称 + * @return string + */ + public static function route($route = '') + { + if (!empty($route)) { + self::$route = $route; + } else { + return self::$route; + } + } + + /** + * 获取当前请求的调度信息 + * @access public + * @param array $dispatch 调度信息 + * @return array + */ + public static function dispatch($dispatch = []) + { + if (!empty($type)) { + self::$dispatch = $dispatch; + } else { + return self::$dispatch; + } + } + +}