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 相关文章推荐
第一节--面向对象编程
Nov 16 PHP
php 静态化实现代码
Mar 20 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
Apr 28 PHP
php中url传递中文字符,特殊危险字符的解决方法
Aug 17 PHP
php通过exif_read_data函数获取图片的exif信息
May 21 PHP
weiphp微信公众平台授权设置
Jan 04 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
Oct 25 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
PHP预定义超全局数组变量小结
Aug 20 PHP
php面试实现反射注入的详细方法
Sep 30 PHP
php实现文件上传基本验证
Mar 04 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
用ODBC的分页显示
2006/10/09 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
php中批量替换文件名的实现代码
2011/07/20 PHP
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
$()JS小技巧
2007/07/21 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
JavaScript排序算法动画演示效果的实现方法
2016/10/18 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
python Matplotlib模块的使用
2020/09/16 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
Python与C/C++的相互调用案例
2021/03/04 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
幼儿园老师辞职信
2014/01/20 职场文书
探矿工程师自荐信
2014/01/24 职场文书
婚礼主持结束词
2014/03/13 职场文书
求职信结尾怎么写
2014/05/26 职场文书
工作经验交流材料
2014/12/30 职场文书
2015年环保局工作总结
2015/05/22 职场文书