mirror of
https://gitee.com/fastadminnet/framework.git
synced 2026-07-07 23:22:48 +08:00
优化URl地址生成
This commit is contained in:
@@ -116,7 +116,6 @@ class Route
|
|||||||
} else {
|
} else {
|
||||||
self::$rules['domain'][$domain]['[bind]'] = [$rule, $option, $pattern];
|
self::$rules['domain'][$domain]['[bind]'] = [$rule, $option, $pattern];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function setDomain($domain)
|
private static function setDomain($domain)
|
||||||
|
|||||||
@@ -11,8 +11,6 @@
|
|||||||
|
|
||||||
namespace think;
|
namespace think;
|
||||||
|
|
||||||
use think\App;
|
|
||||||
use think\Cache;
|
|
||||||
use think\Config;
|
use think\Config;
|
||||||
use think\Request;
|
use think\Request;
|
||||||
use think\Route;
|
use think\Route;
|
||||||
@@ -68,13 +66,8 @@ class Url
|
|||||||
parse_str($vars, $vars);
|
parse_str($vars, $vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($info['query'])) {
|
|
||||||
// 解析地址里面参数 合并到vars
|
|
||||||
parse_str($info['query'], $params);
|
|
||||||
$vars = array_merge($params, $vars);
|
|
||||||
}
|
|
||||||
if ($url) {
|
if ($url) {
|
||||||
$rule = Route::name(isset($name) ? $name : $url);
|
$rule = Route::name(isset($name) ? $name : $url . (isset($info['query']) ? '?' . $info['query'] : ''));
|
||||||
}
|
}
|
||||||
if (!empty($rule) && $match = self::getRuleUrl($rule, $vars)) {
|
if (!empty($rule) && $match = self::getRuleUrl($rule, $vars)) {
|
||||||
// 匹配路由命名标识 快速生成
|
// 匹配路由命名标识 快速生成
|
||||||
@@ -85,16 +78,13 @@ class Url
|
|||||||
} elseif (!empty($rule) && isset($name)) {
|
} elseif (!empty($rule) && isset($name)) {
|
||||||
throw new \InvalidArgumentException('route name not exists:' . $name);
|
throw new \InvalidArgumentException('route name not exists:' . $name);
|
||||||
} else {
|
} else {
|
||||||
// 获取路由别名
|
if (isset($info['query'])) {
|
||||||
$alias = self::getRouteAlias();
|
// 解析地址里面参数 合并到vars
|
||||||
// 检测路由
|
parse_str($info['query'], $params);
|
||||||
if (0 !== strpos($url, '/') && isset($alias[$url]) && $match = self::getRouteUrl($alias[$url], $vars)) {
|
$vars = array_merge($params, $vars);
|
||||||
// 处理路由规则中的特殊字符
|
|
||||||
$url = $match;
|
|
||||||
} else {
|
|
||||||
// 路由不存在 直接解析
|
|
||||||
$url = self::parseUrl($url, $domain);
|
|
||||||
}
|
}
|
||||||
|
// 路由不存在 直接解析
|
||||||
|
$url = self::parseUrl($url, $domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检测URL绑定
|
// 检测URL绑定
|
||||||
@@ -222,18 +212,6 @@ class Url
|
|||||||
return $domain;
|
return $domain;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检测路由规则中的变量是否有传入
|
|
||||||
protected static function pattern($pattern, $vars)
|
|
||||||
{
|
|
||||||
foreach ($pattern as $key => $type) {
|
|
||||||
if (1 == $type && !isset($vars[$key])) {
|
|
||||||
// 变量未设置
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 解析URL后缀
|
// 解析URL后缀
|
||||||
protected static function parseSuffix($suffix)
|
protected static function parseSuffix($suffix)
|
||||||
{
|
{
|
||||||
@@ -246,39 +224,6 @@ class Url
|
|||||||
return (empty($suffix) || 0 === strpos($suffix, '.')) ? $suffix : '.' . $suffix;
|
return (empty($suffix) || 0 === strpos($suffix, '.')) ? $suffix : '.' . $suffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 匹配路由地址
|
|
||||||
public static function getRouteUrl($alias, &$vars = [])
|
|
||||||
{
|
|
||||||
foreach ($alias as $key => $val) {
|
|
||||||
list($url, $pattern, $param) = $val;
|
|
||||||
// 检查变量匹配
|
|
||||||
$array = $vars;
|
|
||||||
$match = false;
|
|
||||||
if ($pattern && self::pattern($pattern, $vars)) {
|
|
||||||
foreach ($pattern as $key => $val) {
|
|
||||||
if (isset($vars[$key])) {
|
|
||||||
$url = str_replace(['[:' . $key . ']', '<' . $key . '?>', ':' . $key . '', '<' . $key . '>'], $vars[$key], $url);
|
|
||||||
unset($array[$key]);
|
|
||||||
} else {
|
|
||||||
$url = str_replace(['/[:' . $key . ']', '[:' . $key . ']', '<' . $key . '?>'], '', $url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$match = true;
|
|
||||||
} elseif (empty($pattern) && array_intersect_assoc($param, $array) == $param) {
|
|
||||||
$match = true;
|
|
||||||
}
|
|
||||||
if ($match && !empty($param) && array_intersect_assoc($param, $array) != $param) {
|
|
||||||
$match = false;
|
|
||||||
}
|
|
||||||
if ($match) {
|
|
||||||
// 存在变量定义
|
|
||||||
$vars = array_diff_key($array, $param);
|
|
||||||
return $url;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 匹配路由地址
|
// 匹配路由地址
|
||||||
public static function getRuleUrl($rule, &$vars = [])
|
public static function getRuleUrl($rule, &$vars = [])
|
||||||
{
|
{
|
||||||
@@ -296,69 +241,6 @@ class Url
|
|||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成路由映射并缓存
|
|
||||||
private static function getRouteAlias()
|
|
||||||
{
|
|
||||||
if ($item = Cache::get('think_route_map')) {
|
|
||||||
return $item;
|
|
||||||
}
|
|
||||||
// 获取路由定义
|
|
||||||
$array = Route::rules();
|
|
||||||
foreach ($array as $type => $rules) {
|
|
||||||
foreach ($rules as $rule => $val) {
|
|
||||||
if (true === $val || empty($val['rule'])) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$route = $val['route'];
|
|
||||||
$vars = $val['var'];
|
|
||||||
if (is_array($val['rule'])) {
|
|
||||||
foreach ($val['rule'] as $val) {
|
|
||||||
$key = $val['rule'];
|
|
||||||
$route = $val['route'];
|
|
||||||
$var = $val['var'];
|
|
||||||
$param = [];
|
|
||||||
if (is_array($route)) {
|
|
||||||
$route = implode('\\', $route);
|
|
||||||
} elseif ($route instanceof \Closure) {
|
|
||||||
continue;
|
|
||||||
} elseif (strpos($route, '?')) {
|
|
||||||
list($route, $str) = explode('?', $route, 2);
|
|
||||||
parse_str($str, $param);
|
|
||||||
}
|
|
||||||
$var = array_merge($vars, $var);
|
|
||||||
$item[$route][] = [$rule . '/' . $key, $var, $param];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$param = [];
|
|
||||||
if (is_array($route)) {
|
|
||||||
$route = implode('\\', $route);
|
|
||||||
} elseif ($route instanceof \Closure) {
|
|
||||||
continue;
|
|
||||||
} elseif (strpos($route, '?')) {
|
|
||||||
list($route, $str) = explode('?', $route, 2);
|
|
||||||
parse_str($str, $param);
|
|
||||||
}
|
|
||||||
$item[$route][] = [$rule, $vars, $param];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 检测路由别名
|
|
||||||
$alias = Route::rules('alias');
|
|
||||||
foreach ($alias as $rule => $route) {
|
|
||||||
$route = is_array($route) ? $route[0] : $route;
|
|
||||||
$item[$route][] = [$rule, [], []];
|
|
||||||
}
|
|
||||||
!App::$debug && Cache::set('think_route_map', $item);
|
|
||||||
return $item;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 清空路由别名缓存
|
|
||||||
public static function clearAliasCache()
|
|
||||||
{
|
|
||||||
Cache::rm('think_route_map');
|
|
||||||
}
|
|
||||||
|
|
||||||
// 指定当前生成URL地址的root
|
// 指定当前生成URL地址的root
|
||||||
public static function root($root)
|
public static function root($root)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user