内核更新
This commit is contained in:
@@ -18,7 +18,7 @@ return [
|
|||||||
// 注册的根命名空间
|
// 注册的根命名空间
|
||||||
'root_namespace' => [],
|
'root_namespace' => [],
|
||||||
// 扩展配置文件
|
// 扩展配置文件
|
||||||
'extra_config_list' => ['database', 'route', 'validate'],
|
'extra_config_list' => ['database', 'validate'],
|
||||||
// 扩展函数文件
|
// 扩展函数文件
|
||||||
'extra_file_list' => [THINK_PATH . 'helper' . EXT],
|
'extra_file_list' => [THINK_PATH . 'helper' . EXT],
|
||||||
// 默认输出类型
|
// 默认输出类型
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ class App
|
|||||||
protected static $routeMust;
|
protected static $routeMust;
|
||||||
|
|
||||||
protected static $dispatch;
|
protected static $dispatch;
|
||||||
|
protected static $file = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 执行应用程序
|
* 执行应用程序
|
||||||
@@ -388,8 +389,9 @@ class App
|
|||||||
if (!empty($config['extra_file_list'])) {
|
if (!empty($config['extra_file_list'])) {
|
||||||
foreach ($config['extra_file_list'] as $file) {
|
foreach ($config['extra_file_list'] as $file) {
|
||||||
$file = strpos($file, '.') ? $file : APP_PATH . $file . EXT;
|
$file = strpos($file, '.') ? $file : APP_PATH . $file . EXT;
|
||||||
if (is_file($file)) {
|
if (is_file($file) && !isset(self::$file[$file])) {
|
||||||
include_once $file;
|
include $file;
|
||||||
|
self::$file[$file] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -479,9 +481,12 @@ class App
|
|||||||
$check = !is_null(self::$routeCheck) ? self::$routeCheck : $config['url_route_on'];
|
$check = !is_null(self::$routeCheck) ? self::$routeCheck : $config['url_route_on'];
|
||||||
if ($check) {
|
if ($check) {
|
||||||
// 开启路由
|
// 开启路由
|
||||||
if (!empty($config['route'])) {
|
if (is_file(RUNTIME_PATH . 'route.php')) {
|
||||||
|
// 读取路由缓存
|
||||||
|
Route::rules(include RUNTIME_PATH . 'route.php' ?: []);
|
||||||
|
} elseif (is_file(CONF_PATH . 'route' . CONF_EXT)) {
|
||||||
// 导入路由配置
|
// 导入路由配置
|
||||||
Route::import($config['route']);
|
Route::import(include CONF_PATH . 'route' . CONF_EXT ?: []);
|
||||||
}
|
}
|
||||||
// 路由检测(根据路由定义返回不同的URL调度)
|
// 路由检测(根据路由定义返回不同的URL调度)
|
||||||
$result = Route::check($request, $path, $depr, $config['url_domain_deploy']);
|
$result = Route::check($request, $path, $depr, $config['url_domain_deploy']);
|
||||||
|
|||||||
@@ -65,6 +65,9 @@ class Route
|
|||||||
// 路由命名标识(用于快速URL生成)
|
// 路由命名标识(用于快速URL生成)
|
||||||
private static $name = [];
|
private static $name = [];
|
||||||
// 当前子域名绑定
|
// 当前子域名绑定
|
||||||
|
private static $domainBind;
|
||||||
|
private static $domainRule;
|
||||||
|
// 当前域名
|
||||||
private static $domain;
|
private static $domain;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -96,13 +99,32 @@ 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::domain($key, $item, $option, $pattern);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self::$rules['domain'][$domain] = [$rule, $option, $pattern];
|
if ($rule instanceof \Closure) {
|
||||||
|
// 执行闭包
|
||||||
|
self::setDomain($domain);
|
||||||
|
call_user_func_array($rule, []);
|
||||||
|
self::setDomain(null);
|
||||||
|
} elseif (is_array($rule)) {
|
||||||
|
self::setDomain($domain);
|
||||||
|
self::group('', function () use ($rule) {
|
||||||
|
// 动态注册域名的路由规则
|
||||||
|
self::registerRules($rule);
|
||||||
|
}, $option, $pattern);
|
||||||
|
self::setDomain(null);
|
||||||
|
} else {
|
||||||
|
self::$rules['domain'][$domain]['[bind]'] = [$rule, $option, $pattern];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static function setDomain($domain)
|
||||||
|
{
|
||||||
|
self::$domain = $domain;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置路由绑定
|
* 设置路由绑定
|
||||||
* @access public
|
* @access public
|
||||||
@@ -211,7 +233,7 @@ class Route
|
|||||||
public static function rule($rule, $route = '', $type = '*', $option = [], $pattern = [])
|
public static function rule($rule, $route = '', $type = '*', $option = [], $pattern = [])
|
||||||
{
|
{
|
||||||
$group = self::getGroup('name');
|
$group = self::getGroup('name');
|
||||||
if (!is_null($group)) {
|
if (!empty($group)) {
|
||||||
// 路由分组
|
// 路由分组
|
||||||
$option = array_merge(self::getGroup('option'), $option);
|
$option = array_merge(self::getGroup('option'), $option);
|
||||||
$pattern = array_merge(self::getGroup('pattern'), $pattern);
|
$pattern = array_merge(self::getGroup('pattern'), $pattern);
|
||||||
@@ -270,19 +292,34 @@ class Route
|
|||||||
}
|
}
|
||||||
$vars = self::parseVar($rule);
|
$vars = self::parseVar($rule);
|
||||||
if (isset($name)) {
|
if (isset($name)) {
|
||||||
self::$name[$name] = [$rule, $vars];
|
self::$name[$name] = [$rule, $vars, self::$domain];
|
||||||
}
|
}
|
||||||
if ($group) {
|
if ($group) {
|
||||||
self::$rules[$type][$group]['rule'][] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern];
|
if ('*' != $type) {
|
||||||
|
$option['method'] = $type;
|
||||||
|
}
|
||||||
|
if (self::$domain) {
|
||||||
|
self::$rules['domain'][self::$domain]['*'][$group]['rule'][] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern];
|
||||||
|
} else {
|
||||||
|
self::$rules['*'][$group]['rule'][] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern];
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ('*' != $type && isset(self::$rules['*'][$rule])) {
|
if ('*' != $type && isset(self::$rules['*'][$rule])) {
|
||||||
unset(self::$rules['*'][$rule]);
|
unset(self::$rules['*'][$rule]);
|
||||||
}
|
}
|
||||||
self::$rules[$type][$rule] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern];
|
if (self::$domain) {
|
||||||
|
self::$rules['domain'][self::$domain][$type][$rule] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern];
|
||||||
|
} else {
|
||||||
|
self::$rules[$type][$rule] = ['rule' => $rule, 'route' => $route, 'var' => $vars, 'option' => $option, 'pattern' => $pattern];
|
||||||
|
}
|
||||||
if ('*' == $type) {
|
if ('*' == $type) {
|
||||||
// 注册路由快捷方式
|
// 注册路由快捷方式
|
||||||
foreach (['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'] as $method) {
|
foreach (['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'] as $method) {
|
||||||
self::$rules[$method][$rule] = true;
|
if (self::$domain) {
|
||||||
|
self::$rules['domain'][self::$domain][$method][$rule] = true;
|
||||||
|
} else {
|
||||||
|
self::$rules[$method][$rule] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -299,7 +336,7 @@ class Route
|
|||||||
if (isset(self::$group[$type])) {
|
if (isset(self::$group[$type])) {
|
||||||
return self::$group[$type];
|
return self::$group[$type];
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return 'name' == $type ? null : [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,30 +370,33 @@ class Route
|
|||||||
$option = $name;
|
$option = $name;
|
||||||
$name = isset($option['name']) ? $option['name'] : '';
|
$name = isset($option['name']) ? $option['name'] : '';
|
||||||
}
|
}
|
||||||
|
// 分组
|
||||||
|
$currentGroup = self::getGroup('name');
|
||||||
|
if ($currentGroup) {
|
||||||
|
$name = $currentGroup . ($name ? '/' . ltrim($name, '/') : '');
|
||||||
|
}
|
||||||
if (!empty($name)) {
|
if (!empty($name)) {
|
||||||
// 分组
|
|
||||||
$currentGroup = self::getGroup('name');
|
|
||||||
if ($currentGroup) {
|
|
||||||
$name = $currentGroup . '/' . ltrim($name, '/');
|
|
||||||
}
|
|
||||||
if ($routes instanceof \Closure) {
|
if ($routes instanceof \Closure) {
|
||||||
$currentOption = self::getGroup('option');
|
$currentOption = self::getGroup('option');
|
||||||
$currentPattern = self::getGroup('pattern');
|
$currentPattern = self::getGroup('pattern');
|
||||||
self::setGroup($name, $option, $pattern);
|
self::setGroup($name, array_merge($currentOption, $option), array_merge($currentPattern, $pattern));
|
||||||
call_user_func_array($routes, []);
|
call_user_func_array($routes, []);
|
||||||
self::setGroup($currentGroup, $currentOption, $currentPattern);
|
self::setGroup($currentGroup, $currentOption, $currentPattern);
|
||||||
self::$rules['*'][$name]['route'] = '';
|
if ($currentGroup != $name) {
|
||||||
self::$rules['*'][$name]['var'] = self::parseVar($name);
|
self::$rules['*'][$name]['route'] = '';
|
||||||
self::$rules['*'][$name]['option'] = $option;
|
self::$rules['*'][$name]['var'] = self::parseVar($name);
|
||||||
self::$rules['*'][$name]['pattern'] = $pattern;
|
self::$rules['*'][$name]['option'] = $option;
|
||||||
|
self::$rules['*'][$name]['pattern'] = $pattern;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
$item = [];
|
||||||
foreach ($routes as $key => $val) {
|
foreach ($routes as $key => $val) {
|
||||||
if (is_numeric($key)) {
|
if (is_numeric($key)) {
|
||||||
$key = array_shift($val);
|
$key = array_shift($val);
|
||||||
}
|
}
|
||||||
if (is_array($val)) {
|
if (is_array($val)) {
|
||||||
$route = $val[0];
|
$route = $val[0];
|
||||||
$option1 = array_merge($option, $val[1]);
|
$option1 = array_merge($option, isset($val[1]) ? $val[1] : []);
|
||||||
$pattern1 = array_merge($pattern, isset($val[2]) ? $val[2] : []);
|
$pattern1 = array_merge($pattern, isset($val[2]) ? $val[2] : []);
|
||||||
} else {
|
} else {
|
||||||
$route = $val;
|
$route = $val;
|
||||||
@@ -375,22 +415,16 @@ class Route
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} elseif ($routes instanceof \Closure) {
|
||||||
|
// 闭包注册
|
||||||
|
$currentOption = self::getGroup('option');
|
||||||
|
$currentPattern = self::getGroup('pattern');
|
||||||
|
self::setGroup('', array_merge($currentOption, $option), array_merge($currentPattern, $pattern));
|
||||||
|
call_user_func_array($routes, []);
|
||||||
|
self::setGroup($currentGroup, $currentOption, $currentPattern);
|
||||||
} else {
|
} else {
|
||||||
if ($routes instanceof \Closure) {
|
// 批量注册路由
|
||||||
// 闭包注册
|
self::rule($routes, '', '*', $option, $pattern);
|
||||||
$currentGroup = self::getGroup('name');
|
|
||||||
$currentOption = self::getGroup('option');
|
|
||||||
$currentPattern = self::getGroup('pattern');
|
|
||||||
if ($currentGroup) {
|
|
||||||
$name = $currentGroup . '/' . ltrim($name, '/');
|
|
||||||
}
|
|
||||||
self::setGroup($name, $option, $pattern);
|
|
||||||
call_user_func_array($routes, []);
|
|
||||||
self::setGroup($currentGroup, $currentOption, $currentPattern);
|
|
||||||
} else {
|
|
||||||
// 批量注册路由
|
|
||||||
self::rule($routes, '', '*', $option, $pattern);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -624,7 +658,7 @@ class Route
|
|||||||
if (is_array($rules)) {
|
if (is_array($rules)) {
|
||||||
self::$rules = $rules;
|
self::$rules = $rules;
|
||||||
} elseif ($rules) {
|
} elseif ($rules) {
|
||||||
return self::$rules[$rules];
|
return true === $rules ? self::$rules : self::$rules[$rules];
|
||||||
} else {
|
} else {
|
||||||
$rules = self::$rules;
|
$rules = self::$rules;
|
||||||
unset($rules['pattern'], $rules['alias'], $rules['domain']);
|
unset($rules['pattern'], $rules['alias'], $rules['domain']);
|
||||||
@@ -636,10 +670,11 @@ class Route
|
|||||||
* 检测子域名部署
|
* 检测子域名部署
|
||||||
* @access public
|
* @access public
|
||||||
* @param Request $request Request请求对象
|
* @param Request $request Request请求对象
|
||||||
|
* @param array $currentRules 当前路由规则
|
||||||
* @param string $method 请求类型
|
* @param string $method 请求类型
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function checkDomain($request, $method = 'GET')
|
public static function checkDomain($request, &$currentRules, $method = 'GET')
|
||||||
{
|
{
|
||||||
// 域名规则
|
// 域名规则
|
||||||
$rules = self::$rules['domain'];
|
$rules = self::$rules['domain'];
|
||||||
@@ -684,55 +719,45 @@ class Route
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!empty($item)) {
|
if (!empty($item)) {
|
||||||
self::$domain = true;
|
if (isset($item['[bind]'])) {
|
||||||
// 解析子域名部署规则
|
// 解析子域名部署规则
|
||||||
list($rule, $option, $pattern) = $item;
|
list($rule, $option, $pattern) = $item['[bind]'];
|
||||||
if (!empty($option['https']) && !$request->isSsl()) {
|
if (!empty($option['https']) && !$request->isSsl()) {
|
||||||
// https检测
|
// https检测
|
||||||
throw new HttpException(404, 'must use https request:' . $host);
|
throw new HttpException(404, 'must use https request:' . $host);
|
||||||
}
|
|
||||||
if ($rule instanceof \Closure) {
|
|
||||||
// 执行闭包
|
|
||||||
$reflect = new \ReflectionFunction($rule);
|
|
||||||
self::$bind = $reflect->invokeArgs([]);
|
|
||||||
return;
|
|
||||||
} elseif (is_array($rule)) {
|
|
||||||
// 清空当前路由规则
|
|
||||||
self::$rules[$method] = [];
|
|
||||||
self::$rules['*'] = [];
|
|
||||||
self::group('', function () use ($rule) {
|
|
||||||
// 动态注册域名的路由规则
|
|
||||||
self::registerRules($rule);
|
|
||||||
}, $option, $pattern);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strpos($rule, '?')) {
|
|
||||||
// 传入其它参数
|
|
||||||
$array = parse_url($rule);
|
|
||||||
$result = $array['path'];
|
|
||||||
parse_str($array['query'], $params);
|
|
||||||
if (isset($panDomain)) {
|
|
||||||
$pos = array_search('*', $params);
|
|
||||||
if (false !== $pos) {
|
|
||||||
// 泛域名作为参数
|
|
||||||
$params[$pos] = $panDomain;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$_GET = array_merge($_GET, $params);
|
|
||||||
} else {
|
|
||||||
$result = $rule;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 === strpos($result, '\\')) {
|
if (strpos($rule, '?')) {
|
||||||
// 绑定到命名空间 例如 \app\index\behavior
|
// 传入其它参数
|
||||||
self::$bind = ['type' => 'namespace', 'namespace' => $result];
|
$array = parse_url($rule);
|
||||||
} elseif (0 === strpos($result, '@')) {
|
$result = $array['path'];
|
||||||
// 绑定到类 例如 @app\index\controller\User
|
parse_str($array['query'], $params);
|
||||||
self::$bind = ['type' => 'class', 'class' => substr($result, 1)];
|
if (isset($panDomain)) {
|
||||||
|
$pos = array_search('*', $params);
|
||||||
|
if (false !== $pos) {
|
||||||
|
// 泛域名作为参数
|
||||||
|
$params[$pos] = $panDomain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_GET = array_merge($_GET, $params);
|
||||||
|
} else {
|
||||||
|
$result = $rule;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 === strpos($result, '\\')) {
|
||||||
|
// 绑定到命名空间 例如 \app\index\behavior
|
||||||
|
self::$bind = ['type' => 'namespace', 'namespace' => $result];
|
||||||
|
} elseif (0 === strpos($result, '@')) {
|
||||||
|
// 绑定到类 例如 @app\index\controller\User
|
||||||
|
self::$bind = ['type' => 'class', 'class' => substr($result, 1)];
|
||||||
|
} else {
|
||||||
|
// 绑定到模块/控制器 例如 index/user
|
||||||
|
self::$bind = ['type' => 'module', 'module' => $result];
|
||||||
|
}
|
||||||
|
self::$domainBind = true;
|
||||||
} else {
|
} else {
|
||||||
// 绑定到模块/控制器 例如 index/user
|
self::$domainRule = $item;
|
||||||
self::$bind = ['type' => 'module', 'module' => $result];
|
$currentRules = isset($item[$method]) ? $item[$method] : $item['*'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -762,13 +787,12 @@ class Route
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$method = $request->method();
|
$method = $request->method();
|
||||||
// 检测域名部署
|
|
||||||
if ($checkDomain) {
|
|
||||||
self::checkDomain($request, $method);
|
|
||||||
}
|
|
||||||
// 获取当前请求类型的路由规则
|
// 获取当前请求类型的路由规则
|
||||||
$rules = self::$rules[$method];
|
$rules = self::$rules[$method];
|
||||||
|
// 检测域名部署
|
||||||
|
if ($checkDomain) {
|
||||||
|
self::checkDomain($request, $rules, $method);
|
||||||
|
}
|
||||||
// 检测URL绑定
|
// 检测URL绑定
|
||||||
$return = self::checkUrlBind($url, $rules, $depr);
|
$return = self::checkUrlBind($url, $rules, $depr);
|
||||||
if (false !== $return) {
|
if (false !== $return) {
|
||||||
@@ -781,7 +805,7 @@ class Route
|
|||||||
// 静态路由规则检测
|
// 静态路由规则检测
|
||||||
$rule = $rules[$url];
|
$rule = $rules[$url];
|
||||||
if (true === $rule) {
|
if (true === $rule) {
|
||||||
$rule = self::$rules['*'][$url];
|
$rule = self::getRouteExpress($url);
|
||||||
}
|
}
|
||||||
if (!empty($rule['route'])) {
|
if (!empty($rule['route'])) {
|
||||||
return self::parseRule($url, $rule['route'], $url, $rule['option']);
|
return self::parseRule($url, $rule['route'], $url, $rule['option']);
|
||||||
@@ -795,6 +819,11 @@ class Route
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static function getRouteExpress($key)
|
||||||
|
{
|
||||||
|
return self::$domainRule ? self::$domainRule['*'][$key] : self::$rules['*'][$key];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检测路由规则
|
* 检测路由规则
|
||||||
* @access private
|
* @access private
|
||||||
@@ -809,7 +838,7 @@ class Route
|
|||||||
{
|
{
|
||||||
foreach ($rules as $key => $item) {
|
foreach ($rules as $key => $item) {
|
||||||
if (true === $item) {
|
if (true === $item) {
|
||||||
$item = self::$rules['*'][$key];
|
$item = self::getRouteExpress($key);
|
||||||
}
|
}
|
||||||
if (!isset($item['rule'])) {
|
if (!isset($item['rule'])) {
|
||||||
continue;
|
continue;
|
||||||
@@ -925,7 +954,7 @@ class Route
|
|||||||
return self::bindToNamespace($url, $bind, $depr);
|
return self::bindToNamespace($url, $bind, $depr);
|
||||||
case 'module':
|
case 'module':
|
||||||
// 如果有模块/控制器绑定 针对路由到 模块/控制器 有效
|
// 如果有模块/控制器绑定 针对路由到 模块/控制器 有效
|
||||||
$url = (empty(self::$domain) ? $bind . '/' : '') . ltrim($url, '/');
|
$url = (empty(self::$domainBind) ? $bind . '/' : '') . ltrim($url, '/');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,9 @@ use think\Route;
|
|||||||
|
|
||||||
class Url
|
class Url
|
||||||
{
|
{
|
||||||
|
// 生成URL地址的root
|
||||||
|
protected static $root;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* URL生成 支持路由反射
|
* URL生成 支持路由反射
|
||||||
* @param string $url URL表达式,
|
* @param string $url URL表达式,
|
||||||
@@ -75,6 +78,9 @@ class Url
|
|||||||
if ($rule && $match = self::getRuleUrl($rule, $vars)) {
|
if ($rule && $match = self::getRuleUrl($rule, $vars)) {
|
||||||
// 匹配路由命名标识 快速生成
|
// 匹配路由命名标识 快速生成
|
||||||
$url = $match;
|
$url = $match;
|
||||||
|
if (!empty($rule[2])) {
|
||||||
|
$domain = $rule[2];
|
||||||
|
}
|
||||||
} elseif ($rule && isset($name)) {
|
} elseif ($rule && isset($name)) {
|
||||||
throw new \InvalidArgumentException('route name not exists:' . $name);
|
throw new \InvalidArgumentException('route name not exists:' . $name);
|
||||||
} else {
|
} else {
|
||||||
@@ -86,7 +92,7 @@ class Url
|
|||||||
$url = $match;
|
$url = $match;
|
||||||
} else {
|
} else {
|
||||||
// 路由不存在 直接解析
|
// 路由不存在 直接解析
|
||||||
$url = self::parseUrl($url);
|
$url = self::parseUrl($url, $domain);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,12 +132,12 @@ class Url
|
|||||||
// 检测域名
|
// 检测域名
|
||||||
$domain = self::parseDomain($url, $domain);
|
$domain = self::parseDomain($url, $domain);
|
||||||
// URL组装
|
// URL组装
|
||||||
$url = $domain . Request::instance()->root() . '/' . ltrim($url, '/');
|
$url = $domain . (self::$root ?: Request::instance()->root()) . '/' . ltrim($url, '/');
|
||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 直接解析URL地址
|
// 直接解析URL地址
|
||||||
protected static function parseUrl($url)
|
protected static function parseUrl($url, $domain)
|
||||||
{
|
{
|
||||||
$request = Request::instance();
|
$request = Request::instance();
|
||||||
if (0 === strpos($url, '/')) {
|
if (0 === strpos($url, '/')) {
|
||||||
@@ -145,8 +151,17 @@ class Url
|
|||||||
$url = substr($url, 1);
|
$url = substr($url, 1);
|
||||||
} else {
|
} else {
|
||||||
// 解析到 模块/控制器/操作
|
// 解析到 模块/控制器/操作
|
||||||
$module = $request->module();
|
$module = $request->module();
|
||||||
$module = $module ? $module . '/' : '';
|
$domains = Route::rules('domain');
|
||||||
|
if (isset($domains[$domain]['[bind]'][0])) {
|
||||||
|
$bindModule = $domains[$domain]['[bind]'][0];
|
||||||
|
if ($bindModule && !in_array($bindModule[0], ['\\', '@'])) {
|
||||||
|
$module = '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$module = $module ? $module . '/' : '';
|
||||||
|
}
|
||||||
|
|
||||||
$controller = $request->controller();
|
$controller = $request->controller();
|
||||||
if ('' == $url) {
|
if ('' == $url) {
|
||||||
// 空字符串输出当前的 模块/控制器/操作
|
// 空字符串输出当前的 模块/控制器/操作
|
||||||
@@ -181,7 +196,7 @@ class Url
|
|||||||
if (0 === strpos($domain_prefix, '*.') && strpos($domain, ltrim($domain_prefix, '*.')) !== false) {
|
if (0 === strpos($domain_prefix, '*.') && strpos($domain, ltrim($domain_prefix, '*.')) !== false) {
|
||||||
foreach ($domains as $key => $rule) {
|
foreach ($domains as $key => $rule) {
|
||||||
$rule = is_array($rule) ? $rule[0] : $rule;
|
$rule = is_array($rule) ? $rule[0] : $rule;
|
||||||
if (false === strpos($key, '*') && 0 === strpos($url, $rule)) {
|
if (is_string($rule) && false === strpos($key, '*') && 0 === strpos($url, $rule)) {
|
||||||
$url = ltrim($url, $rule);
|
$url = ltrim($url, $rule);
|
||||||
$domain = $key;
|
$domain = $key;
|
||||||
// 生成对应子域名
|
// 生成对应子域名
|
||||||
@@ -342,4 +357,11 @@ class Url
|
|||||||
{
|
{
|
||||||
Cache::rm('think_route_map');
|
Cache::rm('think_route_map');
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
// 指定当前生成URL地址的root
|
||||||
|
public static function root($root)
|
||||||
|
{
|
||||||
|
self::$root = $root;
|
||||||
|
Request::instance()->root($root);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -551,7 +551,7 @@ class Validate
|
|||||||
break;
|
break;
|
||||||
case 'boolean':
|
case 'boolean':
|
||||||
// 是否为布尔值
|
// 是否为布尔值
|
||||||
$result = $this->filter($value, FILTER_VALIDATE_BOOLEAN);
|
$result = in_array($value, [0, 1, true, false]);
|
||||||
break;
|
break;
|
||||||
case 'array':
|
case 'array':
|
||||||
// 是否为数组
|
// 是否为数组
|
||||||
|
|||||||
@@ -226,13 +226,17 @@ abstract class Connection
|
|||||||
/**
|
/**
|
||||||
* 设置数据库的配置参数
|
* 设置数据库的配置参数
|
||||||
* @access public
|
* @access public
|
||||||
* @param string $config 配置名称
|
* @param string|array $config 配置名称
|
||||||
* @param mixed $value 配置值
|
* @param mixed $value 配置值
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setConfig($config, $value)
|
public function setConfig($config, $value = '')
|
||||||
{
|
{
|
||||||
$this->config[$config] = $value;
|
if (is_array($config)) {
|
||||||
|
$this->config = array_merge($this->config, $config);
|
||||||
|
} else {
|
||||||
|
$this->config[$config] = $value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -247,7 +251,7 @@ abstract class Connection
|
|||||||
public function connect(array $config = [], $linkNum = 0, $autoConnection = false)
|
public function connect(array $config = [], $linkNum = 0, $autoConnection = false)
|
||||||
{
|
{
|
||||||
if (!isset($this->links[$linkNum])) {
|
if (!isset($this->links[$linkNum])) {
|
||||||
if (empty($config)) {
|
if (!$config) {
|
||||||
$config = $this->config;
|
$config = $this->config;
|
||||||
}
|
}
|
||||||
// 连接参数
|
// 连接参数
|
||||||
@@ -281,20 +285,6 @@ abstract class Connection
|
|||||||
return $this->links[$linkNum];
|
return $this->links[$linkNum];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取当前数据库的驱动类型
|
|
||||||
* @access public
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getDriverName()
|
|
||||||
{
|
|
||||||
if ($this->linkID) {
|
|
||||||
return $this->linkID->getAttribute(PDO::ATTR_DRIVER_NAME);
|
|
||||||
} else {
|
|
||||||
return $this->config['type'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 释放查询结果
|
* 释放查询结果
|
||||||
* @access public
|
* @access public
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ class Query
|
|||||||
public function __construct(Connection $connection = null, $model = '')
|
public function __construct(Connection $connection = null, $model = '')
|
||||||
{
|
{
|
||||||
$this->connection = $connection ?: Db::connect([], true);
|
$this->connection = $connection ?: Db::connect([], true);
|
||||||
$this->driver = $this->connection->getDriverName();
|
$this->driver = $this->connection->getConfig('type');
|
||||||
$this->prefix = $this->connection->getConfig('prefix');
|
$this->prefix = $this->connection->getConfig('prefix');
|
||||||
$this->model = $model;
|
$this->model = $model;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,6 +74,12 @@ class Sqlsrv extends Connection
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$sql = "SELECT column_name FROM information_schema.key_column_usage WHERE table_name='$tableName'";
|
||||||
|
$pdo = $this->linkID->query($sql);
|
||||||
|
$result = $pdo->fetch(PDO::FETCH_ASSOC);
|
||||||
|
if ($result) {
|
||||||
|
$info[$result['column_name']]['primary'] = true;
|
||||||
|
}
|
||||||
return $this->fieldCase($info);
|
return $this->fieldCase($info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -189,8 +189,12 @@ class Merge extends Model
|
|||||||
|
|
||||||
if (!empty($where)) {
|
if (!empty($where)) {
|
||||||
$pk = $this->getPk();
|
$pk = $this->getPk();
|
||||||
if (is_string($pk) && isset($data[$pk])) {
|
|
||||||
unset($data[$pk]);
|
if (isset($this->mapFields[$pk])) {
|
||||||
|
$pk = $this->mapFields[$pk];
|
||||||
|
}
|
||||||
|
if (isset($where[$pk])) {
|
||||||
|
unset($where[$pk]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user