但用U('/规则'),一旦需要修改路由规则,那么所有的U('/规则')处都得修改,为方便,对源码作如下处理:
1.在核心公共函数库加
function str_replace_limit($search, $replace, $subject, $limit = - 1) {
if (is_array($search)) {
foreach ($search as $k => $v) {
$search[$k] = '/' . preg_quote($search[$k], '/') . '/';
}
}
else {
$search = '/' . preg_quote($search, '/') . '/';
}
return preg_replace($search, $replace, $subject, $limit);
}
function routeUrl($url, $vars) {
$route = C('URL_ROUTE_RULES');
$route_vars = implode(C('URL_PATHINFO_DEPR'), $vars);
foreach ($route as $k => $v) {
if (stristr($v, $url) !== false) {
if (stripos($k, '/', 0) === 0) { //正则路由
$k1 = trim($k, '/^$');
$route_prefix = stristr($k1, '(', true);
$preg = '/(\(.*\))/U';
preg_match_all($preg, $k1, $arr);
$str = str_replace_limit($arr[1], $vars, $k1, 1);
if(strpos($str,'\\')!==false){
$str=str_replace('\\','',$str);
}
return __APP__ . C('URL_PATHINFO_DEPR') . $str . C('TMPL_TEMPLATE_SUFFIX');
}
else { //规则路由,不支持静态路由
if (stristr($k, ':') == false && stristr($k, '/') == false) {
return __APP__ . C('URL_PATHINFO_DEPR') . $k . C('TMPL_TEMPLATE_SUFFIX');
}
else {
$route_prefix = stristr($k, '/', true);
return __APP__ . C('URL_PATHINFO_DEPR') . $route_prefix . C('URL_PATHINFO_DEPR') . $route_vars . C('TMPL_TEMPLATE_SUFFIX');
}
}
}
else {
continue;
}
}
}2.2.在U()方法内 //url组装上面加if ($vars['p'] != '[PAGE]') { //分页路由由Page类处理,参数名为默认'p'
$route_url = routeUrl($url, $vars);
if ($route_url !== null) {
return $route_url;
}
}示例:'/^nav_(\d{0,5})$/' =>'Home/Index/nav?id=:1',下面方法都可以使用U('/nva_3');
U('Home/Index/nav','id=3');
U('Home/Index/nav',array('id'=>3));最后生成的url都是 域名/nav_3.html这样,随便用U('/规则'),U('模块/控制器/方法','参数'),都能生成路由地址
PS:
路由表达式需写全 模块/控制器/方法
C('URL_PATHINFO_DEPR')为默认'/',其它未测试
C('TMPL_TEMPLATE_SUFFIX')为默认'html',其它未测试
参数不支持U('模块/控制器/方法/参数名1/值1/参数名2/值2')
只支持U('模块/控制器/方法',参数字符串或数组)
参数键名尽量避免与Page类参数名相同(p或page之类的,C('VAR_PAGE')),防冲突
如有bug留言或自行修改分享出来
另外page类在默认模块时,用U()方法生成的url会省略模块名,导致在默认模块内不支持分页路由
可以将show()方法内的
$this->url = U(ACTION_NAME, $this->parameter);改为$this->url = U(MODULE_NAME . C('URL_PATHINFO_DEPR') . CONTROLLER_NAME . C('URL_PATHINFO_DEPR').ACTION_NAME, $this->parameter);相关:http://www.thinkphp.cn/topic/36606.html 最佳答案