diff --git a/convention.php b/convention.php index eca9e883..a95b6b50 100644 --- a/convention.php +++ b/convention.php @@ -93,6 +93,8 @@ return [ 'url_controller_layer' => 'controller', // 表单请求类型伪装变量 'var_method' => '_method', + // URL解析方式 module controller class namespace + 'url_parse_type' => 'module', // +---------------------------------------------------------------------- // | 模板引擎设置 diff --git a/library/think/App.php b/library/think/App.php index 2ebf6d52..d4c40b09 100644 --- a/library/think/App.php +++ b/library/think/App.php @@ -95,8 +95,13 @@ class App // 获取应用调度信息 $dispatch = self::$dispatch; if (empty($dispatch)) { - // 未指定调度类型 则进行URL路由检测 - $dispatch = self::routeCheck($request, $config); + if (IS_API) { + // 直接绑定到控制器类命名空间 URL区分大小写 v1/User/getInfo + $dispatch = Route::bindToApi($request->path(), self::$namespace, $config['pathinfo_depr']); + } else { + // 进行URL路由检测 + $dispatch = self::routeCheck($request, $config); + } } // 记录当前调度信息 $request->dispatch($dispatch); @@ -468,7 +473,7 @@ class App } if (false === $result) { // 路由无效 解析模块/控制器/操作/参数... 支持控制器自动搜索 - $result = Route::parseUrl($path, $depr, $config['controller_auto_search'], $config['url_param_type']); + $result = Route::parseUrl($path, $depr, $config['controller_auto_search'], $config['url_param_type'], $config['url_parse_type']); } return $result; } diff --git a/library/think/Route.php b/library/think/Route.php index 47f9449d..59ee4bdd 100644 --- a/library/think/Route.php +++ b/library/think/Route.php @@ -656,13 +656,13 @@ class Route // 路由不匹配 } elseif (0 === strpos($rule, '\\')) { // 路由到类 - return self::bindToClass($array[1], substr($rule, 1)); + return self::bindToClass($array[1], substr($rule, 1), $depr); } elseif (0 === strpos($url, '@')) { // 路由到控制器类 - return self::bindToController($array[1], substr($rule, 1)); + return self::bindToController($array[1], substr($rule, 1), $depr); } else { // 路由到模块/控制器 - return self::bindToModule($array[1], $rule); + return self::bindToModule($array[1], $rule, $depr); } } @@ -679,7 +679,7 @@ class Route self::checkDomain($request); } // 检测URL绑定 - $return = self::checkUrlBind($url, $rules); + $return = self::checkUrlBind($url, $rules, $depr); if ($return) { return $return; } @@ -779,9 +779,10 @@ class Route * @access private * @param string $url URL地址 * @param array $rules 路由规则 + * @param string $depr URL分隔符 * @return false */ - private static function checkUrlBind(&$url, &$rules) + private static function checkUrlBind(&$url, &$rules, $depr = '/') { if (!empty(self::$bind['type'])) { // 记录绑定信息 @@ -790,10 +791,10 @@ class Route switch (self::$bind['type']) { case 'class': // 绑定到类 - return self::bindToClass($url, self::$bind['class']); + return self::bindToClass($url, self::$bind['class'], $depr); case 'namespace': // 绑定到命名空间 - return self::bindToNamespace($url, self::$bind['namespace']); + return self::bindToNamespace($url, self::$bind['namespace'], $depr); case 'module': // 如果有模块/控制器绑定 针对路由到 模块/控制器 有效 $url = self::$bind['module'] . '/' . $url; @@ -814,11 +815,12 @@ class Route * @access public * @param string $url URL地址 * @param string $class 类名(带命名空间) + * @param string $depr URL分隔符 * @return array */ - public static function bindToClass($url, $class) + public static function bindToClass($url, $class, $depr = '/') { - $array = explode('/', $url, 2); + $array = explode($depr, $url, 2); if (!empty($array[1])) { self::parseUrlParams($array[1]); } @@ -830,11 +832,12 @@ class Route * @access public * @param string $url URL地址 * @param string $namespace 命名空间 + * @param string $depr URL分隔符 * @return array */ - public static function bindToNamespace($url, $namespace) + public static function bindToNamespace($url, $namespace, $depr = '/') { - $array = explode('/', $url, 3); + $array = explode($depr, $url, 3); $class = !empty($array[0]) ? $array[0] : Config::get('default_controller'); $method = !empty($array[1]) ? $array[1] : Config::get('default_action'); if (!empty($array[2])) { @@ -848,11 +851,12 @@ class Route * @access public * @param string $url URL地址 * @param string $module 模块名 + * @param string $depr URL分隔符 * @return array */ - public static function bindToController($url, $controller) + public static function bindToController($url, $controller, $depr = '/') { - $array = explode('/', $url, 2); + $array = explode($depr, $url, 2); $action = !empty($array[0]) ? $array[0] : Config::get('default_action'); if (!empty($array[1])) { self::parseUrlParams($array[1]); @@ -865,11 +869,12 @@ class Route * @access public * @param string $url URL地址 * @param string $class 控制器类名(带命名空间) + * @param string $depr URL分隔符 * @return array */ - public static function bindToModule($url, $controller) + public static function bindToModule($url, $controller, $depr = '/') { - $array = explode('/', $url, 2); + $array = explode($depr, $url, 2); $action = !empty($array[0]) ? $array[0] : Config::get('default_action'); if (!empty($array[1])) { self::parseUrlParams($array[1]); @@ -877,6 +882,27 @@ class Route return ['type' => 'module', 'module' => $controller . '/' . $action]; } + /** + * 绑定到API + * @access public + * @param string $url URL地址 + * @param string $namespace 命名空间 + * @param string $depr URL分隔符 + * @return array + */ + public static function bindToApi($url, $namespace, $depr = '/') + { + $array = explode($depr, $url, 4); + $module = !empty($array[0]) ? $array[0] : Config::get('default_module'); + $class = !empty($array[1]) ? $array[1] : Config::get('default_controller'); + $method = !empty($array[2]) ? $array[2] : Config::get('default_action'); + $layer = Config::get('url_controller_layer'); + if (!empty($array[3])) { + self::parseUrlParams($array[3]); + } + return ['type' => 'method', 'method' => [$namespace . '\\' . $module . '\\' . $layer . '\\' . $class, $method], 'params' => []]; + } + /** * 路由参数有效性检查 * @access private @@ -976,9 +1002,10 @@ class Route * @param string $depr URL分隔符 * @param bool $autoSearch 是否自动深度搜索控制器 * @param integer $paramType URL参数解析方式 0 名称解析 1 顺序解析 + * @param string $type 路由类型 * @return array */ - public static function parseUrl($url, $depr = '/', $autoSearch = false, $paramType = 0) + public static function parseUrl($url, $depr = '/', $autoSearch = false, $paramType = 0, $type = 'module') { if (isset(self::$bind['module'])) { // 如果有模块/控制器绑定 @@ -994,7 +1021,7 @@ class Route if (!empty($result['var'])) { $_GET = array_merge($result['var'], $_GET); } - return ['type' => 'module', 'module' => $result['route']]; + return ['type' => $type, $type => $result['route']]; } /**