/** * 解析url获取pathinfo * * @return void */ public static function parsePathInfo() { $urlModel = Config::get('url_model'); $pathInfo = []; $isCli = Request::isCli(); //是否为命令行访问 if ($isCli) { isset($_SERVER['argv'][1]) && ($pathInfo = explode('/', $_SERVER['argv'][1])); } else { if ($urlModel === 1 || $urlModel === 2) { //pathInfo模式(含显示、隐藏index.php两种)SCRIPT_NAME if (isset($_GET[Config::get('var_pathinfo')])) { $param = $_GET[Config::get('var_pathinfo')]; } else { $param = preg_replace('/(.*)\\/(.*)\\.php(.*)/i', '\\1\\3', $_SERVER['REQUEST_URI']); $scriptName = preg_replace('/(.*)\\/(.*)\\.php(.*)/i', '\\1', $_SERVER['SCRIPT_NAME']); if (!empty($scriptName)) { $param = substr($param, strpos($param, $scriptName) + strlen($scriptName)); } } $param = ltrim($param, '/'); if (!empty($param)) { //无参数时直接跳过取默认操作 //获取参数 $pathInfo = explode(Config::get('url_pathinfo_depr'), trim(preg_replace(['/\\' . Config::get('url_html_suffix') . '/', '/\\&.*/', '/\\?.*/'], '', $param), Config::get('url_pathinfo_depr'))); } } elseif ($urlModel === 3 && isset($_GET[Config::get('var_pathinfo')])) { //兼容模式 $urlString = $_GET[Config::get('var_pathinfo')]; unset($_GET[Config::get('var_pathinfo')]); $pathInfo = explode(Config::get('url_pathinfo_depr'), trim(str_replace(Config::get('url_html_suffix'), '', ltrim($urlString, '/')), Config::get('url_pathinfo_depr'))); } } isset($pathInfo[0]) && empty($pathInfo[0]) && ($pathInfo = []); //参数不完整获取默认配置 if (empty($pathInfo)) { $pathInfo = explode('/', trim(Config::get('url_default_action'), '/')); } self::$pathInfo = $pathInfo; }
/** * 解析url * * @return void */ public static function parseUrl() { $path = DIRECTORY_SEPARATOR; $urlModel = Config::get('url_model'); $pathinfo = array(); $isCli = Request::isCli(); //是否为命令行访问 if ($isCli) { isset($_SERVER['argv'][1]) && ($pathinfo = explode('/', $_SERVER['argv'][1])); } else { if ($urlModel === 1 || $urlModel === 2) { //pathinfo模式(含显示、隐藏index.php两种)SCRIPT_NAME if (isset($_GET[Config::get('var_pathinfo')])) { $param = $_GET[Config::get('var_pathinfo')]; } else { $param = preg_replace('/(.*)\\/(.*)\\.php(.*)/i', '\\1\\3', $_SERVER['REQUEST_URI']); $scriptName = preg_replace('/(.*)\\/(.*)\\.php(.*)/i', '\\1', $_SERVER['SCRIPT_NAME']); if (!empty($scriptName)) { $param = substr($param, strpos($param, $scriptName) + strlen($scriptName)); } } $param = ltrim($param, '/'); if (!empty($param)) { //无参数时直接跳过取默认操作 //获取参数 $pathinfo = explode(Config::get('url_pathinfo_depr'), trim(preg_replace(array('/\\' . Config::get('url_html_suffix') . '/', '/\\&.*/', '/\\?.*/'), '', $param), Config::get('url_pathinfo_depr'))); } } elseif ($urlModel === 3 && isset($_GET[Config::get('var_pathinfo')])) { //兼容模式 $urlString = $_GET[Config::get('var_pathinfo')]; unset($_GET[Config::get('var_pathinfo')]); $pathinfo = explode(Config::get('url_pathinfo_depr'), trim(str_replace(Config::get('url_html_suffix'), '', ltrim($urlString, '/')), Config::get('url_pathinfo_depr'))); } } isset($pathinfo[0]) && empty($pathinfo[0]) && ($pathinfo = array()); //参数不完整获取默认配置 if (empty($pathinfo)) { $pathinfo = explode('/', trim(Config::get('url_default_action'), '/')); } self::$pathinfo = $pathinfo; //检测路由 if (self::$rules) { //配置了路由,所有请求通过路由处理 $isRoute = self::isRoute($pathinfo); if ($isRoute[0]) { //匹配路由成功 $routeArr = explode('/', $isRoute['route']); $isRoute = null; self::$urlParams['action'] = array_pop($routeArr); self::$urlParams['controller'] = ucfirst(array_pop($routeArr)); while ($tmp = array_shift($routeArr)) { $path .= $tmp . DIRECTORY_SEPARATOR; } unset($routeArr); } else { self::findAction($pathinfo, $path); //未匹配到路由 按文件名映射查找 } } else { self::findAction($pathinfo, $path); //未匹配到路由 按文件名映射查找 } for ($i = 0; $i < count($pathinfo); $i += 2) { $_GET[$pathinfo[$i]] = $pathinfo[$i + 1]; } unset($pathinfo); if (self::$urlParams['controller'] == '') { //控制器没取到,这时程序会 中止/404,取$path最后1位当做控制器用于异常提醒 $tmp = explode(DIRECTORY_SEPARATOR, trim($path, DIRECTORY_SEPARATOR)); self::$urlParams['controller'] = ucfirst(array_pop($tmp)); $path = empty($tmp) ? '' : DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $tmp) . DIRECTORY_SEPARATOR; } self::$urlParams['path'] = $path ? $path : DIRECTORY_SEPARATOR; unset($path); //定义URL常量 $spath = dirname($_SERVER['SCRIPT_NAME']); if ($spath == '/' || $spath == '\\') { $spath = ''; } //定义项目根目录地址 self::$urlParams['root'] = $spath . '/'; $_REQUEST = array_merge($_REQUEST, $_GET); }
/** * 设置pathInfo信息 * * @param array $pathInfo * * @return array */ public static function setPathInfo($pathInfo) { return self::$pathInfo = $pathInfo; }