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 相关文章推荐
一个目录遍历函数
Oct 09 PHP
Windows下PHP的任意文件执行漏洞
Oct 09 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
Windows IIS PHP 5.2 安装与配置方法
Jun 08 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
Feb 21 PHP
php中OR与|| AND与&amp;&amp;的区别总结
Oct 26 PHP
服务器上配置PHP运行环境教程
Feb 12 PHP
php实现分页显示
Nov 03 PHP
ThinkPHP路由机制简介
Mar 23 PHP
php数组冒泡排序算法实例
May 06 PHP
php实现背景图上添加圆形logo图标的方法
Nov 17 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
世界上第一台立体声收音机
2021/03/01 无线电
PHP 魔术函数使用说明
2010/05/14 PHP
在php和MySql中计算时间差的方法
2011/04/22 PHP
Smarty3配置及入门语法
2017/02/22 PHP
php表单处理操作
2017/11/16 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
js 遍历对象的属性的代码
2011/12/29 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
理解javascript封装
2016/02/23 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
PyQt5实现简单的计算器
2020/05/30 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
python 19个值得学习的编程技巧
2020/08/15 Python
10个顶级Python实用库推荐
2021/03/04 Python
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
趣天网日本站:Qoo10 JP
2019/09/18 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
会计系毕业个人自荐信格式
2013/09/23 职场文书
销售个人求职信范文
2014/04/28 职场文书
化学专业自荐信
2014/05/28 职场文书
二人合伙经营协议书
2014/09/13 职场文书
2014年药房工作总结
2014/11/22 职场文书
SQL SERVER触发器详解
2022/02/24 SQL Server
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android