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查询域名状态whois的类
Nov 25 PHP
PHP COOKIE设置为浏览器进程
Jun 21 PHP
php 分页原理详解
Aug 21 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
CodeIgniter安全相关设置汇总
Jul 03 PHP
PHP实现货币换算的方法
Nov 29 PHP
PHP导入导出Excel代码
Jul 07 PHP
PHP编程求最大公约数与最小公倍数的方法示例
May 29 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
PHP中危险的file_put_contents函数详解
Nov 04 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
Mar 15 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
Oct 16 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
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
vue中tab选项卡的实现思路
2018/11/25 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
Python中的闭包详细介绍和实例
2014/11/21 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
python爬虫之自制英汉字典
2019/06/24 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
python list多级排序知识点总结
2019/10/23 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
pyecharts在数据可视化中的应用详解
2020/06/08 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
后勤工作职责
2013/12/22 职场文书
城管大队整治方案
2014/05/06 职场文书
个人整改措施落实情况汇报
2014/10/29 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
奖励申请报告范文
2015/05/15 职场文书
民事调解书范文
2015/05/20 职场文书
音乐会主持人开场白
2015/05/28 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
七年级思品教学反思
2016/02/20 职场文书
Java tomcat手动配置servlet详解
2021/11/27 Java/Android
Vue+Flask实现图片传输功能
2022/04/01 Vue.js