改进路由的url分隔符参数 路由规则支持单独设置url分隔符,参数为 param_depr

修正url分隔符设置后 使用 / 仍然可以访问的问题,确保URL访问唯一性
This commit is contained in:
thinkphp
2016-10-07 14:45:57 +08:00
parent cd13dfbcd8
commit 13ef244b80

View File

@@ -798,11 +798,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 +819,8 @@ class Route
if (false !== $return) {
return $return;
}
if ('/' != $url) {
$url = rtrim($url, '/');
if ('|' != $url) {
$url = rtrim($url, '|');
}
if (isset($rules[$url])) {
// 静态路由规则检测
@@ -912,7 +910,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,7 +936,7 @@ class Route
*/
private static function checkRouteAlias($request, $url, $depr)
{
$array = explode('/', $url, 2);
$array = explode('|', $url, 2);
$item = self::$rules['alias'][$array[0]];
if (is_array($item)) {
@@ -1000,7 +998,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 +1017,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 +1037,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 +1056,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]);
@@ -1095,21 +1097,22 @@ 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)) {
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('|', $depr, $url);
$url = str_replace($option['param_depr'], '|', $url);
}
$len1 = substr_count($url, '/');
$len1 = substr_count($url, '|');
$len2 = substr_count($rule, '/');
// 多余参数是否合并
$merge = !empty($option['merge_extra_vars']) ? true : false;
@@ -1140,12 +1143,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 +1175,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 +1189,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, '?')) {
@@ -1225,7 +1226,7 @@ class Route
private static function match($url, $rule, $pattern, $merge)
{
$m2 = explode('/', $rule);
$m1 = $merge ? explode('/', $url, count($m2)) : explode('/', $url);
$m1 = $merge ? explode('|', $url, count($m2)) : explode('|', $url);
$var = [];
foreach ($m2 as $key => $val) {
@@ -1300,7 +1301,7 @@ class Route
if ($rule) {
$rule = explode('/', $rule);
// 获取URL地址中的参数
$paths = $merge ? explode('/', $pathinfo, count($rule)) : explode('/', $pathinfo);
$paths = $merge ? explode('|', $pathinfo, count($rule)) : explode('|', $pathinfo);
foreach ($rule as $item) {
$fun = '';
if (0 === strpos($item, '[:')) {
@@ -1315,7 +1316,7 @@ class Route
}
}
} else {
$paths = explode('/', $pathinfo);
$paths = explode('|', $pathinfo);
}
// 获取路由地址规则
@@ -1372,7 +1373,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 +1433,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 +1463,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);
}