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制作静态网站的模板框架
Oct 09 PHP
PHP 编程请选择正确的文本编辑软件
Dec 21 PHP
wiki-shan写的php在线加密的解密程序
Sep 07 PHP
PHP Document 代码注释规范
Apr 13 PHP
php下批量挂马和批量清马代码
Feb 27 PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 PHP
PHP SPL标准库中的常用函数介绍
May 11 PHP
PHP入门教程之表单与验证实例详解
Sep 11 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
PHP实现登录验证码校验功能
May 17 PHP
Laravel中正确地返回HTTP状态码方法示例
Sep 10 PHP
PHP时间类完整代码实例
Feb 26 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
8个PHP程序员常用的功能汇总
2014/12/18 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
javascript 年月日联动实现核心代码
2009/12/21 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
python中查找excel某一列的重复数据 剔除之后打印
2013/02/10 Python
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
简述Python中的面向对象编程的概念
2015/04/27 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
漂亮的Django Markdown富文本app插件的实现
2019/01/02 Python
24式加速你的Python(小结)
2019/06/13 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
DELPHI面试题研发笔试试卷
2015/11/08 面试题
优秀中专生推荐信
2013/11/17 职场文书
数据员岗位职责
2013/11/19 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
基层党员对照检查材料
2014/08/25 职场文书
泰坦尼克号观后感
2015/06/04 职场文书