规则路由支持 定义变量(正则)规则

This commit is contained in:
thinkphp
2015-12-02 23:49:41 +08:00
parent 14c134dc46
commit 10022f5c10

View File

@@ -26,24 +26,40 @@ class Route
private static $map = []; private static $map = [];
// 子域名部署规则 // 子域名部署规则
private static $domain = []; private static $domain = [];
// 变量规则
private static $pattern = [];
// 添加URL映射规则 // 添加URL映射规则
public static function map($map, $route = '') public static function map($map, $route = '')
{ {
if (is_array($map)) { self::afflux('map', $map, $route);
self::$map = array_merge(self::$map, $map); }
} else {
self::$map[$map] = $route; // 添加变量规则
} public static function pattern($name, $rule = '')
{
self::afflux('pattern', $name, $rule);
}
// 添加路由别名
public static function alias($name, $rule = '')
{
self::afflux('alias', $name, $rule);
} }
// 添加子域名部署规则 // 添加子域名部署规则
public static function domain($domain, $rule = '') public static function domain($domain, $rule = '')
{ {
if (is_array($domain)) { self::afflux('domain', $domain, $rule);
self::$domain = array_merge(self::$domain, $domain); }
// 添加子域名部署规则
private static function afflux($var, $name, $value = '')
{
if (is_array($name)) {
self::${$var} = array_merge(self::${$var}, $name);
} else { } else {
self::$domain[$domain] = $rule; self::${$var}[$name] = $value;
} }
} }
@@ -56,9 +72,26 @@ class Route
} }
} else { } else {
if (is_array($rule)) { if (is_array($rule)) {
// 检查变量规则
if (isset($rule['__pattern__'])) {
self::pattern($rule['__pattern__']);
unset($rule['__pattern__']);
}
// 检查路由映射
if (isset($rule['__map__'])) {
self::map($rule['__map__']);
unset($rule['__map__']);
}
// 检查路由别名
if (isset($rule['__alias__'])) {
self::alias($rule['__alias__']);
unset($rule['__alias__']);
}
foreach ($rule as $key => $val) { foreach ($rule as $key => $val) {
if (0 === strpos($key, '[')) { if (0 === strpos($key, '[')) {
self::$rules[$type][substr($key, 1, -1)] = ['routes' => $val, 'option' => $option]; self::$rules[$type][substr($key, 1, -1)] = ['routes' => $val, 'option' => $option];
} elseif (is_array($val)) {
self::$rules[$type][$key] = ['route' => $val[0], 'option' => $val[1]];
} else { } else {
self::$rules[$type][$key] = ['route' => $val, 'option' => $option]; self::$rules[$type][$key] = ['route' => $val, 'option' => $option];
} }
@@ -66,6 +99,8 @@ class Route
} else { } else {
if (0 === strpos($rule, '[')) { if (0 === strpos($rule, '[')) {
self::$rules[$type][substr($rule, 1, -1)] = ['routes' => $route, 'option' => $option]; self::$rules[$type][substr($rule, 1, -1)] = ['routes' => $route, 'option' => $option];
} elseif (is_array($route)) {
self::$rules[$type][$rule] = ['route' => $route[0], 'option' => $route[1]];
} else { } else {
self::$rules[$type][$rule] = ['route' => $route, 'option' => $option]; self::$rules[$type][$rule] = ['route' => $route, 'option' => $option];
} }
@@ -194,6 +229,7 @@ class Route
// 获取当前请求类型的路由规则 // 获取当前请求类型的路由规则
$rules = self::$rules[REQUEST_METHOD]; $rules = self::$rules[REQUEST_METHOD];
if (!empty(self::$rules['*'])) { if (!empty(self::$rules['*'])) {
// 合并任意请求的路由规则 // 合并任意请求的路由规则
$rules = array_merge(self::$rules['*'], $rules); $rules = array_merge(self::$rules['*'], $rules);
@@ -357,24 +393,14 @@ class Route
return $reflect->invokeArgs($args); return $reflect->invokeArgs($args);
} }
// 解析模块的URL地址 [模块/]控制器/操作 // 解析模块的URL地址 [控制器/操作?]参数1=值1&参数2=值2...
public static function parseUrl($url) public static function parseUrl($url)
{ {
if ('/' == $url) { $result = self::parseRoute($url);
return [null, null, null]; if (!empty($result['var'])) {
$_GET = array_merge($result['var'], $_GET);
} }
$paths = explode('/', $url); return $result['route'];
$module = defined('BIND_MODULE') ? BIND_MODULE : array_shift($paths);
$controller = defined('BIND_CONTROLLER') ? BIND_CONTROLLER : array_shift($paths);
$action = $paths ? array_shift($paths) : null;
// 解析剩余的URL参数
$var = [];
if (!empty($paths)) {
preg_replace_callback('/(\w+)\/([^\/]+)/', function ($match) use (&$var) {$var[strtolower($match[1])] = strip_tags($match[2]);}, implode('/', $paths));
}
$_GET = array_merge($var, $_GET);
return [$module, $controller, $action];
} }
// 解析规范的路由地址 // 解析规范的路由地址
@@ -414,11 +440,11 @@ class Route
$val = substr($val, 1, -1); $val = substr($val, 1, -1);
} }
if (0 === strpos($val, ':')) { if (0 === strpos($val, ':')) {
// URL变量
if ($pos = strpos($val, '|')) { if ($pos = strpos($val, '|')) {
// 使用函数过滤 // 使用函数过滤
$val = substr($val, 1, $pos - 1); $val = substr($val, 1, $pos - 1);
} }
// 动态变量
if (strpos($val, '\\')) { if (strpos($val, '\\')) {
$type = substr($val, -1); $type = substr($val, -1);
if ('d' == $type && !is_numeric($m1[$key])) { if ('d' == $type && !is_numeric($m1[$key])) {
@@ -434,6 +460,10 @@ class Route
} else { } else {
$name = substr($val, 1); $name = substr($val, 1);
} }
if (isset(self::$pattern[$name]) && !preg_match(self::$pattern[$name], $m1[$key])) {
// 检查变量规则
return false;
}
$var[$name] = $m1[$key]; $var[$name] = $m1[$key];
} elseif (0 !== strcasecmp($val, $m1[$key])) { } elseif (0 !== strcasecmp($val, $m1[$key])) {
return false; return false;