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 相关文章推荐
DedeCMS 核心类TypeLink.class.php摘要笔记
Apr 07 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
Apr 28 PHP
Thinkphp中的volist标签用法简介
Jun 18 PHP
php通过exif_read_data函数获取图片的exif信息
May 21 PHP
php实现的验证码文件类实例
Jun 18 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
Jul 15 PHP
PHP面向对象详解(三)
Dec 07 PHP
利用PHP生成CSV文件简单示例
Dec 21 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
Ajax+Jpgraph实现的动态折线图功能示例
Feb 11 PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 PHP
phpmyadmin在宝塔面板里进不去的解决方案
Jul 06 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
JS array 数组详解
2009/03/22 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
Python MySQLdb Linux下安装笔记
2015/05/09 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
python区分不同数据类型的方法
2019/10/14 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
Python Flask异步发送邮件实现方法解析
2020/08/01 Python
python获取时间戳的实现示例(10位和13位)
2020/09/23 Python
优秀党员转正的自我评价
2013/10/06 职场文书
大学在校生求职信范文
2013/11/21 职场文书
讲文明懂礼貌演讲稿
2014/09/11 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
总结高并发下Nginx性能如何优化
2021/11/01 Servers
了解Kubernetes中的Service和Endpoint
2022/04/01 Servers
mysql如何查询连续记录
2022/05/11 MySQL