搜索
系统检测到您的用户名不符合规范:

U()方法支持自动转为路由定义的url

浏览:2034 发布日期:2016年04月12日 分类:技术分享 关键字: U()方法 路由
在设置路由的情况下,用U()方法生成链接时,只能U('/规则'),而不能U('模块/控制器/方法','参数'),生成访问的还是普通地址.
但用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
最佳答案
评论() 相关
后面还有条评论,
评论支持使用[code][/code]标签添加代码
您需要登录后才可以评论 登录 | 立即注册
收藏
z11z13
积分:7680 等级:LV5
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

AltStyle によって変換されたページ (->オリジナル) /