public static function group($name, $routes, $option = [], $pattern = [])
{
if (is_array($name)) {
$option = $name;
$name = isset($option['name']) ? $option['name'] : '';
}
// 分组
$currentGroup = self::getGroup('name');
if ($currentGroup) {
$name = $currentGroup . ($name ? '/' . ltrim($name, '/') : '');
}
if (!empty($name)) {
if ($routes instanceof \Closure) {
$currentOption = self::getGroup('option');
$currentPattern = self::getGroup('pattern');
self::setGroup($name, array_merge($currentOption, $option), array_merge($currentPattern, $pattern));
call_user_func_array($routes, []);
self::setGroup($currentGroup, $currentOption, $currentPattern);
if ($currentGroup != $name) {
self::$rules['*'][$name]['route'] = '';
self::$rules['*'][$name]['var'] = self::parseVar($name);
self::$rules['*'][$name]['option'] = $option;
self::$rules['*'][$name]['pattern'] = $pattern;
}
} else {
$item = [];
foreach ($routes as $key => $val) {
if (is_numeric($key)) {
$key = array_shift($val);
}
if (is_array($val)) {
$route = $val[0];
$option1 = array_merge($option, isset($val[1]) ? $val[1] : []);
$pattern1 = array_merge($pattern, isset($val[2]) ? $val[2] : []);
} else {
$route = $val;
}
$options = isset($option1) ? $option1 : $option;
$patterns = isset($pattern1) ? $pattern1 : $pattern;
if ('$' == substr($key, -1, 1)) {
// 是否完整匹配
$options['complete_match'] = true;
$key = substr($key, 0, -1);
}
$vars = self::parseVar($key);
$item[] = ['rule' => $key, 'route' => $route, 'var' => $vars, 'option' => $options, 'pattern' => $patterns];
// 设置路由标识
self::name($route, [$name . '/' . $key, $vars, self::$domain]);
}
self::$rules['*'][$name] = ['rule' => $item, 'route' => '', 'var' => [], 'option' => $option, 'pattern' => $pattern];
}
foreach (['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'] as $method) {
if (!isset(self::$rules[$method][$name])) {
self::$rules[$method][$name] = true;
} elseif (is_array(self::$rules[$method][$name])) {
self::$rules[$method][$name] = array_merge(self::$rules['*'][$name], self::$rules[$method][$name]);
}
}
} 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 {
// 批量注册路由
self::rule($routes, '', '*', $option, $pattern);
}
}