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来检测proxy
Oct 09 PHP
php入门小知识
Mar 24 PHP
PHP中如何判断AJAX提交的数据
Feb 05 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
Jan 11 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
Jan 19 PHP
Codeigniter操作数据库表的优化写法总结
Jun 12 PHP
php从给定url获取文件扩展名的方法
Mar 14 PHP
PHP5.3以上版本安装ZendOptimizer扩展
Mar 27 PHP
php生成curl命令行的方法
Dec 14 PHP
Laravel框架控制器的middleware中间件用法分析
Sep 30 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
Oct 08 PHP
laravel使用redis队列实例讲解
Mar 23 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 xml-rpc远程调用
2008/12/19 PHP
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
php中json_encode中文编码问题分析
2011/09/13 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
jQuery ui 1.7更新小结
2009/08/15 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
layer iframe 设置关闭按钮的方法
2019/09/12 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
wxPython事件驱动实例详解
2014/09/28 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
python判断是空的实例分享
2020/07/06 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
函数指针的定义是什么
2016/08/14 面试题
计算机专业大学生的自我评价
2013/11/14 职场文书
家长给老师的道歉信
2014/01/13 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
导游词之镜泊湖
2019/12/09 职场文书
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python