编辑器更新,此版本还有bug,暂不要更新使用

内核更新
This commit is contained in:
2016-10-12 15:35:02 +08:00
parent 8d1600a2eb
commit e70d287e89
103 changed files with 31476 additions and 175 deletions

View File

@@ -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);
}