优化代码

This commit is contained in:
thinkphp
2016-01-11 23:29:34 +08:00
parent 66e50a4c33
commit 354e8a8db0

View File

@@ -38,8 +38,10 @@ class Url
$vars = array_merge($params, $vars); $vars = array_merge($params, $vars);
} }
// 获取路由别名
$alias = self::getRouteAlias();
// 检测路由 // 检测路由
if ($match = self::getRouteUrl($url, $vars)) { if (isset($alias[$url]) && $match = self::getRouteUrl($alias[$url], $vars)) {
// 处理路由规则中的特殊字符 // 处理路由规则中的特殊字符
$url = str_replace('[--think--]', '', $match); $url = str_replace('[--think--]', '', $match);
} else { } else {
@@ -178,34 +180,32 @@ class Url
} }
// 匹配路由地址 // 匹配路由地址
public static function getRouteUrl($name, &$vars = []) public static function getRouteUrl($alias, &$vars = [])
{ {
$alias = self::getRouteAlias(); foreach ($alias as $key => $val) {
if (!empty($alias[$name])) { list($url, $pattern) = $val;
foreach ($alias[$name] as $key => $val) { // 解析安全替换
list($url, $pattern) = $val; if (strpos($url, '$')) {
// 检查变量匹配 $url = str_replace('$', '[--think--]', $url);
if (strpos($url, '$')) { }
$url = str_replace('$', '[--think--]', $url); // 检查变量匹配
} if (self::pattern($pattern, $vars)) {
if (self::pattern($pattern, $vars)) { foreach ($vars as $key => $val) {
foreach ($vars as $key => $val) { if (false !== strpos($url, '[:' . $key . ']')) {
if (false !== strpos($url, '[:' . $key . ']')) { $url = str_replace('[:' . $key . ']', $val, $url);
$url = str_replace('[:' . $key . ']', $val, $url); unset($vars[$key]);
unset($vars[$key]); } elseif (false !== strpos($url, ':' . $key)) {
} elseif (false !== strpos($url, ':' . $key)) { $url = str_replace(':' . $key, $val, $url);
$url = str_replace(':' . $key, $val, $url); unset($vars[$key]);
unset($vars[$key]);
}
} }
return $url;
} }
return $url;
} }
} }
return false; return false;
} }
// 自动生成路由别名 // 生成路由别名并缓存
private static function getRouteAlias() private static function getRouteAlias()
{ {
if ($alias = Cache::get('think_route_alias')) { if ($alias = Cache::get('think_route_alias')) {
@@ -213,33 +213,33 @@ class Url
} }
// 获取路由定义 // 获取路由定义
$rules = Route::getRules(); $rules = Route::getRules();
if ($rules) { if (empty($rules)) {
foreach ($rules as $rule => $val) { return [];
if (!empty($val['routes'])) { }
foreach ($val['routes'] as $key => $route) { foreach ($rules as $rule => $val) {
if (is_numeric($key)) { if (!empty($val['routes'])) {
$key = array_shift($route); foreach ($val['routes'] as $key => $route) {
} if (is_numeric($key)) {
$route = $route[0]; $key = array_shift($route);
if (strpos($route, '?')) {
$route = strstr($route, '?', true);
}
$var = self::parseVar($rule . '/' . $key);
$alias[$route][] = [$rule . '/' . $key, $var];
} }
} else { $route = $route[0];
$route = $val['route'];
if (strpos($route, '?')) { if (strpos($route, '?')) {
$route = strstr($route, '?', true); $route = strstr($route, '?', true);
} }
$var = self::parseVar($rule); $var = self::parseVar($rule . '/' . $key);
$alias[$route][] = [$rule, $var]; $alias[$route][] = [$rule . '/' . $key, $var];
} }
} else {
$route = $val['route'];
if (strpos($route, '?')) {
$route = strstr($route, '?', true);
}
$var = self::parseVar($rule);
$alias[$route][] = [$rule, $var];
} }
Cache::set('think_route_alias', $alias);
return $alias;
} }
return []; Cache::set('think_route_alias', $alias);
return $alias;
} }
// 分析路由规则中的变量 // 分析路由规则中的变量