yii框架中的Url生产问题小结


Posted in PHP onJanuary 16, 2012
<?php echo CHtml::link('错误链接','user/register')?> 
<?php echo CHtml::link('正确链接',array('user/register'))?>

假定设定了UrlManager的配置为Path模式,用yii默认的配置:
'urlManager'=>array( 
'urlFormat'=>'path', 
'rules'=>array( 
'<controller:\w+>/<id:\d+>'=>'<controller>/view', 
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', 
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>', 
), 
),

上面两行代码会生产什么样的链接地址?
http://<site-addr>/user/register //错误链接
http://<site-addr>/index.php/user/register //正确链接
第一个链接是错误的,浏览器会返回404错误。第二个链接会访问UserController的Register方法。区别就在于第二个链接在生成的时候我们传入的参数是一个array数组,而第一个方法是一个简单字符串。Yii在处理Url的时候,遇到简单字符串会直接使用该字符串作为最终的Url,而当遇到数组的时候会调用Controller的CreateUrl来生成Url.
说到简单字符串,这两个链接中其实有一个非常本质的区别。虽然同样都是字符串'user/register',但是在第一个字符串中就代表一个13个字符的相对路径,而第二个链接中则代表UserController的registerAction,是有着特俗意义的。
附上Yii处理Url的方法NormalizeUrl的源代码:
/** 
* Normalizes the input parameter to be a valid URL. 
* 
* If the input parameter is an empty string, the currently requested URL will be returned. 
* 
* If the input parameter is a non-empty string, it is treated as a valid URL and will 
* be returned without any change. 
* 
* If the input parameter is an array, it is treated as a controller route and a list of 
* GET parameters, and the {@link CController::createUrl} method will be invoked to 
* create a URL. In this case, the first array element refers to the controller route, 
* and the rest key-value pairs refer to the additional GET parameters for the URL. 
* For example, <code>array('post/list', 'page'=>3)</code> may be used to generate the URL 
* <code>/index.php?r=post/list&page=3</code>. 
* 
* @param mixed $url the parameter to be used to generate a valid URL 
* @return string the normalized URL 
*/ 
public static function normalizeUrl($url) 
{ 
if(is_array($url)) 
{ 
if(isset($url[0])) 
{ 
if(($c=Yii::app()->getController())!==null) 
$url=$c->createUrl($url[0],array_splice($url,1)); 
else 
$url=Yii::app()->createUrl($url[0],array_splice($url,1)); 
} 
else 
$url=''; 
} 
return $url==='' ? Yii::app()->getRequest()->getUrl() : $url; 
}
PHP 相关文章推荐
用PHP实现小型站点广告管理(修正版)
Oct 09 PHP
生成sessionid和随机密码的例子
Oct 09 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
May 07 PHP
php&amp;mysql 日期操作小记
Feb 27 PHP
php笔记之:php函数range() round()和list()的使用说明
Apr 26 PHP
PHP定时更新程序设计思路分享
Jun 10 PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 PHP
smarty中英文多编码字符截取乱码问题解决方法
Oct 28 PHP
关于URL最大长度限制的相关资料查证
Dec 23 PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 PHP
php获取文件名称和扩展名的方法
Feb 07 PHP
Smarty模板语法详解
Jul 20 PHP
fgetcvs在linux的问题
Jan 15 #PHP
PHP异步调用socket实现代码
Jan 12 #PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 #PHP
PHP警告Cannot use a scalar value as an array的解决方法
Jan 11 #PHP
Trying to clone an uncloneable object of class Imagic的解决方法
Jan 11 #PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
Jan 11 #PHP
php通过COM类调用组件的实现代码
Jan 11 #PHP
You might like
Window下PHP三种运行方式图文详解
2013/06/11 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
2020/10/28 PHP
直接生成打开窗口代码,不必下载
2008/05/14 Javascript
js过滤数组重复元素的方法
2010/09/05 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
2017/01/05 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
js实现图片实时时钟
2020/01/15 Javascript
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
动态创建类实例代码
2009/10/07 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
python2.7实现邮件发送功能
2018/12/12 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
利用python实现.dcm格式图像转为.jpg格式
2020/01/13 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
python线程里哪种模块比较适合
2020/08/02 Python
Python远程linux执行命令实现
2020/11/11 Python
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
幼儿园保育员辞职信
2014/01/12 职场文书
教师档案管理制度
2014/01/23 职场文书
社会实践感言
2014/01/25 职场文书
《祁黄羊》教学反思
2014/04/22 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
古诗之感恩老师
2019/10/24 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技