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

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

浏览:1001 发布日期: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;
}
最佳答案
评论() 相关
后面还有条评论,
评论支持使用[code][/code]标签添加代码
您需要登录后才可以评论 登录 | 立即注册
收藏
zstxt1989
积分:6535 等级:LV5
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

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

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