Route参数增加merge_extra_vars参数 设置是否合并最后变量

This commit is contained in:
thinkphp
2016-05-26 22:08:50 +08:00
parent 2e44f2a154
commit 468222c4b8

View File

@@ -783,17 +783,20 @@ class Route
} }
$len1 = substr_count($url, '/'); $len1 = substr_count($url, '/');
$len2 = substr_count($rule, '/'); $len2 = substr_count($rule, '/');
// 多余参数是否合并
$merge = !empty($option['merge_extra_vars']) ? true : false;
if ($len1 >= $len2 || strpos($rule, '[')) { if ($len1 >= $len2 || strpos($rule, '[')) {
if ('$' == substr($rule, -1, 1)) { if ('$' == substr($rule, -1, 1)) {
// 完整匹配 // 完整匹配
if ($len1 != $len2 && false === strpos($rule, '[')) { if (!$merge && $len1 != $len2 && false === strpos($rule, '[')) {
return false; return false;
} else { } else {
$rule = substr($rule, 0, -1); $rule = substr($rule, 0, -1);
} }
} }
$pattern = array_merge(self::$pattern, $pattern); $pattern = array_merge(self::$pattern, $pattern);
if (false !== $match = self::match($url, $rule, $pattern)) { if (false !== $match = self::match($url, $rule, $pattern, $merge)) {
// 匹配到路由规则 // 匹配到路由规则
// 检测是否定义路由 // 检测是否定义路由
if (!empty($option['after_behavior'])) { if (!empty($option['after_behavior'])) {
@@ -813,7 +816,7 @@ class Route
// 执行闭包 // 执行闭包
return ['type' => 'function', 'function' => $route, 'params' => $match]; return ['type' => 'function', 'function' => $route, 'params' => $match];
} }
return self::parseRule($rule, $route, $url, $match); return self::parseRule($rule, $route, $url, $match, $merge);
} }
} }
return false; return false;
@@ -927,12 +930,14 @@ class Route
* @param string $url URL地址 * @param string $url URL地址
* @param string $rule 路由规则 * @param string $rule 路由规则
* @param array $pattern 变量规则 * @param array $pattern 变量规则
* @param bool $merge 合并额外变量
* @return array|false * @return array|false
*/ */
private static function match($url, $rule, $pattern) private static function match($url, $rule, $pattern, $merge)
{ {
$m1 = explode('/', $url); $m2 = explode('/', $rule);
$m2 = explode('/', $rule); $m1 = explode('/', $url, $merge ? count($m2) : null);
$var = []; $var = [];
foreach ($m2 as $key => $val) { foreach ($m2 as $key => $val) {
// val中定义了多个变量 <id><name> // val中定义了多个变量 <id><name>
@@ -985,16 +990,18 @@ class Route
* @param string $route 路由地址 * @param string $route 路由地址
* @param string $pathinfo URL地址 * @param string $pathinfo URL地址
* @param array $matches 匹配的变量 * @param array $matches 匹配的变量
* @param bool $merge 合并额外变量
* @return array * @return array
*/ */
private static function parseRule($rule, $route, $pathinfo, $matches) private static function parseRule($rule, $route, $pathinfo, $matches, $merge)
{ {
// 获取URL地址中的参数
$paths = explode('/', $pathinfo);
// 获取路由地址规则
$url = is_array($route) ? $route[0] : $route;
// 解析路由规则 // 解析路由规则
$rule = explode('/', $rule); $rule = explode('/', $rule);
// 获取URL地址中的参数
$paths = explode('/', $pathinfo, $merge ? count($rule) : null);
// 获取路由地址规则
$url = is_array($route) ? $route[0] : $route;
foreach ($rule as $item) { foreach ($rule as $item) {
$fun = ''; $fun = '';
if (0 === strpos($item, '[:')) { if (0 === strpos($item, '[:')) {