Route类增加auto方法 支持注册一个自动解析URL的路由

This commit is contained in:
thinkphp
2016-07-30 22:28:05 +08:00
parent 62b8d6039c
commit 5715d3cdb9

View File

@@ -95,10 +95,10 @@ class Route
{ {
if (is_array($domain)) { if (is_array($domain)) {
foreach ($domain as $key => $item) { foreach ($domain as $key => $item) {
self::$rules['domain'][$key][] = [$item, $option, $pattern]; self::$rules['domain'][$key] = [$item, $option, $pattern];
} }
} else { } else {
self::$rules['domain'][$domain][] = [$rule, $option, $pattern]; self::$rules['domain'][$domain] = [$rule, $option, $pattern];
} }
} }
@@ -598,6 +598,17 @@ class Route
self::rule('__miss__', $route, $method, $option, []); self::rule('__miss__', $route, $method, $option, []);
} }
/**
* 注册一个自动解析的URL路由
* @access public
* @param string $route 路由地址
* @return void
*/
public static function auto($route)
{
self::rule('__auto__', $route, '*', [], []);
}
/** /**
* 获取或者批量设置路由定义 * 获取或者批量设置路由定义
* @access public * @access public
@@ -669,53 +680,51 @@ class Route
} }
} }
if (!empty($item)) { if (!empty($item)) {
self::$domain = true; self::$domain = true;
foreach ($item as $val) { list($rule, $option, $pattern) = $item;
list($rule, $option, $pattern) = $val; // 子域名部署规则
// 子域名部署规则 if ($rule instanceof \Closure) {
if ($rule instanceof \Closure) { // 执行闭包
// 执行闭包 $reflect = new \ReflectionFunction($rule);
$reflect = new \ReflectionFunction($rule); self::$bind = $reflect->invokeArgs([]);
self::$bind = $reflect->invokeArgs([]); return;
return; } elseif (is_array($rule)) {
} elseif (is_array($rule)) { // 清空当前路由规则
// 清空当前路由规则 self::$rules[$method] = [];
self::$rules[$method] = []; self::$rules['*'] = [];
self::$rules['*'] = []; self::group('', function () use ($rule) {
self::group('', function () use ($rule) { // 动态注册域名的路由规则
// 动态注册域名的路由规则 self::registerRules($rule);
self::registerRules($rule); }, $option, $pattern);
}, $option, $pattern); return;
return; }
}
if (strpos($rule, '?')) { if (strpos($rule, '?')) {
// 传入其它参数 // 传入其它参数
$array = parse_url($rule); $array = parse_url($rule);
$result = $array['path']; $result = $array['path'];
parse_str($array['query'], $params); parse_str($array['query'], $params);
if (isset($panDomain)) { if (isset($panDomain)) {
$pos = array_search('*', $params); $pos = array_search('*', $params);
if (false !== $pos) { if (false !== $pos) {
// 泛域名作为参数 // 泛域名作为参数
$params[$pos] = $panDomain; $params[$pos] = $panDomain;
}
} }
$_GET = array_merge($_GET, $params);
} else {
$result = $rule;
} }
$_GET = array_merge($_GET, $params);
} else {
$result = $rule;
}
if (0 === strpos($result, '\\')) { if (0 === strpos($result, '\\')) {
// 绑定到命名空间 例如 \app\index\behavior // 绑定到命名空间 例如 \app\index\behavior
self::$bind = ['type' => 'namespace', 'namespace' => $result]; self::$bind = ['type' => 'namespace', 'namespace' => $result];
} elseif (0 === strpos($result, '@')) { } elseif (0 === strpos($result, '@')) {
// 绑定到类 例如 @app\index\controller\User // 绑定到类 例如 @app\index\controller\User
self::$bind = ['type' => 'class', 'class' => substr($result, 1)]; self::$bind = ['type' => 'class', 'class' => substr($result, 1)];
} else { } else {
// 绑定到模块/控制器 例如 index/user // 绑定到模块/控制器 例如 index/user
self::$bind = ['type' => 'module', 'module' => $result]; self::$bind = ['type' => 'module', 'module' => $result];
}
} }
} }
} }
@@ -773,7 +782,7 @@ class Route
// 路由规则检测 // 路由规则检测
if (!empty($rules)) { if (!empty($rules)) {
return self::checkRoute($request, $rules, $url); return self::checkRoute($request, $rules, $url, $depr);
} }
return false; return false;
} }
@@ -784,10 +793,11 @@ class Route
* @param Request $request * @param Request $request
* @param array $rules 路由规则 * @param array $rules 路由规则
* @param string $url URL地址 * @param string $url URL地址
* @param string $depr URL分割符
* @param string $group 路由分组名 * @param string $group 路由分组名
* @return mixed * @return mixed
*/ */
private static function checkRoute($request, $rules, $url, $group = '') private static function checkRoute($request, $rules, $url, $depr = '/', $group = '')
{ {
foreach ($rules as $key => $item) { foreach ($rules as $key => $item) {
if (true === $item) { if (true === $item) {
@@ -818,14 +828,15 @@ class Route
continue; continue;
} }
$result = self::checkRoute($request, $rule, $url, $key); $result = self::checkRoute($request, $rule, $url, $depr, $key);
if (false !== $result) { if (false !== $result) {
return $result; return $result;
} }
} elseif ($route) { } elseif ($route) {
if ('__miss__' == $rule) { if ('__miss__' == $rule || '__auto__' == $rule) {
// 指定MISS路由 // 指定特殊路由
$miss = $item; $var = trim($rule, '__');
${$var} = $item;
continue; continue;
} }
if ($group) { if ($group) {
@@ -837,7 +848,10 @@ class Route
} }
} }
} }
if (isset($miss)) { if (isset($auto)) {
// 自动解析URL地址
return self::parseUrl($auto['route'] . '/' . $url, $depr);
} elseif (isset($miss)) {
// 未匹配所有路由的路由规则处理 // 未匹配所有路由的路由规则处理
return self::parseRule('', $miss['route'], $url, $miss['option']); return self::parseRule('', $miss['route'], $url, $miss['option']);
} }