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

浏览:2024 发布日期: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
最佳答案
评论( 相关
后面还有条评论,点击查看>>