分组不同url模式0和2的冲突

浏览:993 发布日期:2013/09/16 分类:技术分享
U方法的问题,假设两个分组A,B 在各自的分组配置中分别定义url_model为0,2,惯例配置中默认url_model为1,项目配置中不设置该参数。
那么在dispatcher过程中,会根据项目/惯例配置中的url_model来定义一个常量__APP__,
当url_model=1的时候这个值就是 /cms/index.php
url_model=2的时候就是/cms
无奈的是,这个常量定义的时候分组配置还没加载进来
而在U方法中,又根据url_model判断,并使用 __APP__ 这时候url_model是分组配置中的值,而__APP__却不匹配。
比如当你惯例配置为1的时候,你在A分组中明明配置了url_model为2,但是通过U方法生成的url还是1模式的url,也就是带有 /index.php的url。
所以,如果想隐去index.php,不得不将惯例配置中的url_model设置为2。
但是在B分组中又想使用url_model=0的模式,生成的URL就会变成:
/cms?g=B&m=Index&a=index
很明显cms这个文件不存在,至少应该是 /cms/?这样才正确,因为目录后面可以省略首页文档,实际上默认是/cms/index.php? ,但是/cms?的话是将cms作为一个文件去判断的。

最后总结:
惯例/项目配置中 url_model=2
A 分组url_model=2
B 分组url_model=0
项目入口文件:/cms/index.php
生成URL:
A => /cms/A/Index/index
B => /cms?g=B&m=Index&a=index [错误]

解决方案:
1.希望官方优化下U方法,不要直接使用__APP__作为项目地址拼接到url中。或者优化dispatcher,将__APP__的定义放到分组配置加载以后。不管怎么说分组配置都应该是优先级最高的。
2.自行封装一个方法,对U方法的结果进行二次处理,后面我会附上这个方法。/**
 * 由于独立分组配置文件优先级问题,U方法无法使用分组配置中的URL模式,不同分组不同URL模式会导致生成的url冲突。
 * 本函数作为一个上层封装,将U方法处理后的url进行二次处理得到合适的url
 * 要求项目默认url模式为1
 */
function _U($url='',$vars='',$suffix=true,$redirect=false,$domain=false) {
    $url=U($url,$vars,$suffix,$redirect,$domain);//调用原始U方法
    if(!$url){
        return "";
    }
    $urlmodel=C('URL_MODEL');//获取URL模式,优先级为:分组配置>项目配置>惯例配置
    //rewrite模式
    if($urlmodel==2){
        $url=str_replace("/index.php","",$url);
    }
    //兼容模式
    if($urlmode==3){
        $url=str_replace("/index.php","/index.php?s=",$url);
    }
    return $url;
}
最佳答案
评论( 相关
后面还有条评论,点击查看>>