编辑器更新,此版本还有bug,暂不要更新使用
内核更新
This commit is contained in:
@@ -305,7 +305,8 @@ class Route
|
||||
}
|
||||
$vars = self::parseVar($rule);
|
||||
if (isset($name)) {
|
||||
self::name($name, [$rule, $vars, self::$domain]);
|
||||
$key = $group ? $group . '/' . $rule : $rule;
|
||||
self::name($name, [$key, $vars, self::$domain]);
|
||||
}
|
||||
if ($group) {
|
||||
if ('*' != $type) {
|
||||
@@ -425,7 +426,7 @@ class Route
|
||||
$vars = self::parseVar($key);
|
||||
$item[] = ['rule' => $key, 'route' => $route, 'var' => $vars, 'option' => $options, 'pattern' => $patterns];
|
||||
// 设置路由标识
|
||||
self::name($route, [$key, $vars, self::$domain]);
|
||||
self::name($route, [$name . '/' . $key, $vars, self::$domain]);
|
||||
}
|
||||
self::$rules['*'][$name] = ['rule' => $item, 'route' => '', 'var' => [], 'option' => $option, 'pattern' => $pattern];
|
||||
}
|
||||
@@ -798,11 +799,9 @@ class Route
|
||||
public static function check($request, $url, $depr = '/', $checkDomain = false)
|
||||
{
|
||||
// 分隔符替换 确保路由定义使用统一的分隔符
|
||||
if ('/' != $depr) {
|
||||
$url = str_replace($depr, '/', $url);
|
||||
}
|
||||
$url = str_replace($depr, '|', $url);
|
||||
|
||||
if (strpos($url, '/') && isset(self::$rules['alias'][strstr($url, '/', true)])) {
|
||||
if (strpos($url, '|') && isset(self::$rules['alias'][strstr($url, '|', true)])) {
|
||||
// 检测路由别名
|
||||
$result = self::checkRouteAlias($request, $url, $depr);
|
||||
if (false !== $result) {
|
||||
@@ -821,8 +820,8 @@ class Route
|
||||
if (false !== $return) {
|
||||
return $return;
|
||||
}
|
||||
if ('/' != $url) {
|
||||
$url = rtrim($url, '/');
|
||||
if ('|' != $url) {
|
||||
$url = rtrim($url, '|');
|
||||
}
|
||||
if (isset($rules[$url])) {
|
||||
// 静态路由规则检测
|
||||
@@ -830,7 +829,7 @@ class Route
|
||||
if (true === $rule) {
|
||||
$rule = self::getRouteExpress($url);
|
||||
}
|
||||
if (!empty($rule['route']) && self::checkOption($rule['option'], $url, $request)) {
|
||||
if (!empty($rule['route']) && self::checkOption($rule['option'], $request)) {
|
||||
return self::parseRule($url, $rule['route'], $url, $rule['option']);
|
||||
}
|
||||
}
|
||||
@@ -874,7 +873,7 @@ class Route
|
||||
$pattern = $item['pattern'];
|
||||
|
||||
// 检查参数有效性
|
||||
if (!self::checkOption($option, $url, $request)) {
|
||||
if (!self::checkOption($option, $request)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -891,7 +890,7 @@ class Route
|
||||
} else {
|
||||
$str = $key;
|
||||
}
|
||||
if (is_string($str) && $str && 0 !== strpos($url, $str)) {
|
||||
if (is_string($str) && $str && 0 !== strpos(str_replace('|', '/', $url), $str)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -912,7 +911,7 @@ class Route
|
||||
if (isset($options['bind_model']) && isset($option['bind_model'])) {
|
||||
$option['bind_model'] = array_merge($options['bind_model'], $option['bind_model']);
|
||||
}
|
||||
$result = self::checkRule($rule, $route, $url, $pattern, $option);
|
||||
$result = self::checkRule($rule, $route, $url, $pattern, $option, $depr);
|
||||
if (false !== $result) {
|
||||
return $result;
|
||||
}
|
||||
@@ -938,27 +937,32 @@ class Route
|
||||
*/
|
||||
private static function checkRouteAlias($request, $url, $depr)
|
||||
{
|
||||
$array = explode('/', $url, 2);
|
||||
$item = self::$rules['alias'][$array[0]];
|
||||
$array = explode('|', $url);
|
||||
$alias = array_shift($array);
|
||||
$item = self::$rules['alias'][$alias];
|
||||
|
||||
if (is_array($item)) {
|
||||
list($rule, $option) = $item;
|
||||
if (isset($option['method'][$array[0]])) {
|
||||
$option['method'] = $option['method'][$array[0]];
|
||||
}
|
||||
} else {
|
||||
$rule = $item;
|
||||
}
|
||||
$bind = implode('|', $array);
|
||||
// 参数有效性检查
|
||||
if (isset($option) && !self::checkOption($option, $url, $request)) {
|
||||
if (isset($option) && !self::checkOption($option, $request)) {
|
||||
// 路由不匹配
|
||||
return false;
|
||||
} elseif (0 === strpos($rule, '\\')) {
|
||||
// 路由到类
|
||||
return self::bindToClass($array[1], substr($rule, 1), $depr);
|
||||
return self::bindToClass($bind, substr($rule, 1), $depr);
|
||||
} elseif (0 === strpos($url, '@')) {
|
||||
// 路由到控制器类
|
||||
return self::bindToController($array[1], substr($rule, 1), $depr);
|
||||
return self::bindToController($bind, substr($rule, 1), $depr);
|
||||
} else {
|
||||
// 路由到模块/控制器
|
||||
return self::bindToModule($array[1], $rule, $depr);
|
||||
return self::bindToModule($bind, $rule, $depr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1000,7 +1004,8 @@ class Route
|
||||
*/
|
||||
public static function bindToClass($url, $class, $depr = '/')
|
||||
{
|
||||
$array = explode($depr, $url, 2);
|
||||
$url = str_replace($depr, '|', $url);
|
||||
$array = explode('|', $url, 2);
|
||||
$action = !empty($array[0]) ? $array[0] : Config::get('default_action');
|
||||
if (!empty($array[1])) {
|
||||
self::parseUrlParams($array[1]);
|
||||
@@ -1018,7 +1023,8 @@ class Route
|
||||
*/
|
||||
public static function bindToNamespace($url, $namespace, $depr = '/')
|
||||
{
|
||||
$array = explode($depr, $url, 3);
|
||||
$url = str_replace($depr, '|', $url);
|
||||
$array = explode('|', $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])) {
|
||||
@@ -1037,7 +1043,8 @@ class Route
|
||||
*/
|
||||
public static function bindToController($url, $controller, $depr = '/')
|
||||
{
|
||||
$array = explode($depr, $url, 2);
|
||||
$url = str_replace($depr, '|', $url);
|
||||
$array = explode('|', $url, 2);
|
||||
$action = !empty($array[0]) ? $array[0] : Config::get('default_action');
|
||||
if (!empty($array[1])) {
|
||||
self::parseUrlParams($array[1]);
|
||||
@@ -1055,7 +1062,8 @@ class Route
|
||||
*/
|
||||
public static function bindToModule($url, $controller, $depr = '/')
|
||||
{
|
||||
$array = explode($depr, $url, 2);
|
||||
$url = str_replace($depr, '|', $url);
|
||||
$array = explode('|', $url, 2);
|
||||
$action = !empty($array[0]) ? $array[0] : Config::get('default_action');
|
||||
if (!empty($array[1])) {
|
||||
self::parseUrlParams($array[1]);
|
||||
@@ -1067,19 +1075,18 @@ class Route
|
||||
* 路由参数有效性检查
|
||||
* @access private
|
||||
* @param array $option 路由参数
|
||||
* @param string $url URL地址
|
||||
* @param Request $request Request对象
|
||||
* @return bool
|
||||
*/
|
||||
private static function checkOption($option, $url, $request)
|
||||
private static function checkOption($option, $request)
|
||||
{
|
||||
// 请求类型检测
|
||||
if ((isset($option['method']) && false === stripos($option['method'], $request->method()))
|
||||
if ((isset($option['method']) && is_string($option['method']) && false === stripos($option['method'], $request->method()))
|
||||
|| (isset($option['ext']) && false === stripos($option['ext'], $request->ext())) // 伪静态后缀检测
|
||||
|| (isset($option['deny_ext']) && false !== stripos($option['deny_ext'], $request->ext()))
|
||||
|| (isset($option['domain']) && !in_array($option['domain'], [$_SERVER['HTTP_HOST'], self::$subDomain])) // 域名检测
|
||||
|| (!empty($option['https']) && !$request->isSsl()) // https检测
|
||||
|| (!empty($option['before_behavior']) && false === Hook::exec($option['before_behavior'], '', $url)) // 行为检测
|
||||
|| (!empty($option['before_behavior']) && false === Hook::exec($option['before_behavior'])) // 行为检测
|
||||
|| (!empty($option['callback']) && is_callable($option['callback']) && false === call_user_func($option['callback'])) // 自定义检测
|
||||
) {
|
||||
return false;
|
||||
@@ -1095,24 +1102,28 @@ class Route
|
||||
* @param string $url URL地址
|
||||
* @param array $pattern 变量规则
|
||||
* @param array $option 路由参数
|
||||
* @param string $depr URL分隔符(全局)
|
||||
* @return array|false
|
||||
*/
|
||||
private static function checkRule($rule, $route, $url, $pattern, $option)
|
||||
private static function checkRule($rule, $route, $url, $pattern, $option, $depr)
|
||||
{
|
||||
// 检查完整规则定义
|
||||
if (isset($pattern['__url__']) && !preg_match('/^' . $pattern['__url__'] . '/', $url)) {
|
||||
if (isset($pattern['__url__']) && !preg_match('/^' . $pattern['__url__'] . '/', str_replace('|', $depr, $url))) {
|
||||
return false;
|
||||
}
|
||||
// 检测是否设置了参数分隔符
|
||||
if ($depr = Config::get('url_params_depr')) {
|
||||
$url = str_replace($depr, '/', $url);
|
||||
$rule = str_replace($depr, '/', $rule);
|
||||
// 检查路由的参数分隔符
|
||||
if (isset($option['param_depr'])) {
|
||||
$url = str_replace(['|', $option['param_depr']], [$depr, '|'], $url);
|
||||
}
|
||||
|
||||
$len1 = substr_count($url, '/');
|
||||
$len1 = substr_count($url, '|');
|
||||
$len2 = substr_count($rule, '/');
|
||||
// 多余参数是否合并
|
||||
$merge = !empty($option['merge_extra_vars']) ? true : false;
|
||||
if ($merge && $len1 > $len2) {
|
||||
$url = str_replace('|', $depr, $url);
|
||||
$url = implode('|', explode($depr, $url, $len2 + 1));
|
||||
}
|
||||
|
||||
if ($len1 >= $len2 || strpos($rule, '[')) {
|
||||
if (!empty($option['complete_match'])) {
|
||||
@@ -1140,12 +1151,13 @@ class Route
|
||||
*/
|
||||
public static function parseUrl($url, $depr = '/', $autoSearch = false)
|
||||
{
|
||||
|
||||
if (isset(self::$bind['module'])) {
|
||||
// 如果有模块/控制器绑定
|
||||
$url = self::$bind['module'] . '/' . ltrim($url, '/');
|
||||
}
|
||||
|
||||
list($path, $var) = self::parseUrlPath($url, $depr);
|
||||
$url = str_replace($depr, '|', $url);
|
||||
list($path, $var) = self::parseUrlPath($url);
|
||||
$route = [null, null, null];
|
||||
if (isset($path)) {
|
||||
// 解析模块
|
||||
@@ -1171,7 +1183,7 @@ class Route
|
||||
// 解析操作
|
||||
$action = !empty($path) ? array_shift($path) : null;
|
||||
// 解析额外参数
|
||||
self::parseUrlParams(empty($path) ? '' : implode('/', $path));
|
||||
self::parseUrlParams(empty($path) ? '' : implode('|', $path));
|
||||
// 封装路由
|
||||
$route = [$module, $controller, $action];
|
||||
if (isset(self::$rules['name'][implode($depr, $route)])) {
|
||||
@@ -1185,15 +1197,12 @@ class Route
|
||||
* 解析URL的pathinfo参数和变量
|
||||
* @access private
|
||||
* @param string $url URL地址
|
||||
* @param string $depr URL分隔符
|
||||
* @return array
|
||||
*/
|
||||
private static function parseUrlPath($url, $depr = '/')
|
||||
private static function parseUrlPath($url)
|
||||
{
|
||||
// 分隔符替换 确保路由定义使用统一的分隔符
|
||||
if ('/' != $depr) {
|
||||
$url = str_replace($depr, '/', $url);
|
||||
}
|
||||
$url = str_replace('|', '/', $url);
|
||||
$url = trim($url, '/');
|
||||
$var = [];
|
||||
if (false !== strpos($url, '?')) {
|
||||
@@ -1219,13 +1228,12 @@ class Route
|
||||
* @param string $url URL地址
|
||||
* @param string $rule 路由规则
|
||||
* @param array $pattern 变量规则
|
||||
* @param bool $merge 合并额外变量
|
||||
* @return array|false
|
||||
*/
|
||||
private static function match($url, $rule, $pattern, $merge)
|
||||
private static function match($url, $rule, $pattern)
|
||||
{
|
||||
$m2 = explode('/', $rule);
|
||||
$m1 = $merge ? explode('/', $url, count($m2)) : explode('/', $url);
|
||||
$m1 = explode('|', $url);
|
||||
|
||||
$var = [];
|
||||
foreach ($m2 as $key => $val) {
|
||||
@@ -1290,17 +1298,16 @@ class Route
|
||||
* @param string $pathinfo URL地址
|
||||
* @param array $option 路由参数
|
||||
* @param array $matches 匹配的变量
|
||||
* @param bool $merge 合并额外变量
|
||||
* @return array
|
||||
*/
|
||||
private static function parseRule($rule, $route, $pathinfo, $option = [], $matches = [], $merge = false)
|
||||
private static function parseRule($rule, $route, $pathinfo, $option = [], $matches = [])
|
||||
{
|
||||
$request = Request::instance();
|
||||
// 解析路由规则
|
||||
if ($rule) {
|
||||
$rule = explode('/', $rule);
|
||||
// 获取URL地址中的参数
|
||||
$paths = $merge ? explode('/', $pathinfo, count($rule)) : explode('/', $pathinfo);
|
||||
$paths = explode('|', $pathinfo);
|
||||
foreach ($rule as $item) {
|
||||
$fun = '';
|
||||
if (0 === strpos($item, '[:')) {
|
||||
@@ -1315,7 +1322,7 @@ class Route
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$paths = explode('/', $pathinfo);
|
||||
$paths = explode('|', $pathinfo);
|
||||
}
|
||||
|
||||
// 获取路由地址规则
|
||||
@@ -1372,7 +1379,7 @@ class Route
|
||||
}
|
||||
|
||||
// 解析额外参数
|
||||
self::parseUrlParams(empty($paths) ? '' : implode('/', $paths), $matches);
|
||||
self::parseUrlParams(empty($paths) ? '' : implode('|', $paths), $matches);
|
||||
// 记录匹配的路由信息
|
||||
$request->routeInfo(['rule' => $rule, 'route' => $route, 'option' => $option, 'var' => $matches]);
|
||||
|
||||
@@ -1432,12 +1439,11 @@ class Route
|
||||
* 解析URL地址为 模块/控制器/操作
|
||||
* @access private
|
||||
* @param string $url URL地址
|
||||
* @param string $depr URL分隔符
|
||||
* @return array
|
||||
*/
|
||||
private static function parseModule($url, $depr = '/')
|
||||
private static function parseModule($url)
|
||||
{
|
||||
list($path, $var) = self::parseUrlPath($url, $depr);
|
||||
list($path, $var) = self::parseUrlPath($url);
|
||||
$action = array_pop($path);
|
||||
$controller = !empty($path) ? array_pop($path) : null;
|
||||
$module = Config::get('app_multi_module') && !empty($path) ? array_pop($path) : null;
|
||||
@@ -1463,9 +1469,9 @@ class Route
|
||||
{
|
||||
if ($url) {
|
||||
if (Config::get('url_param_type')) {
|
||||
$var += explode('/', $url);
|
||||
$var += explode('|', $url);
|
||||
} else {
|
||||
preg_replace_callback('/(\w+)\/([^\/]+)/', function ($match) use (&$var) {
|
||||
preg_replace_callback('/(\w+)\|([^\|]+)/', function ($match) use (&$var) {
|
||||
$var[$match[1]] = strip_tags($match[2]);
|
||||
}, $url);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user