在Yii中经常要生成URL,不管是为了自动跳转还是仅仅是一个链接。下面对Yii中的URL生成做了一个总结。
提示:以下controllerX代表控制器X,actionX代表方法X。
在Controller::action中,我们要输出一个链接,可以这样做:
$this->createUrl(‘actionName’, array(‘params01′=>’value01′, ‘params02′=>’value02′) );
//Controller::createUrl($route,$params=array(),$ampersand=’&’)

第一个参数是一个字符串,值为路由名。比如action01、controller01/action01等格式。 第二个参数是一个数组,值为所有参数的key=>value对。 第三个参数是URL中每对参数之间的分隔符,一般默认为&不做修改。
假设我们在Controller01::action01中,想要生成指向action02的URL,可以这样做:
$this->createUrl(‘action02′ );

假设我们在Controller01::action01中,想要生成指向controller02::action02的URL,可以这样做:
$this->createUrl(‘action02/action02′ );

若action02是默认action,比如index,那么可省略,但最后的斜杠不可省略,即:
$this->createUrl(‘action02/’ );

斜杠放在最前面即不管代码存在于哪个module下或者哪个controller下,都从整个网站的最顶成生成URL。假设我们的代码存在于user模块的password控制器的reset方法下,下面的代码将会生成不同的URL:
$this->createUrl(‘/abc’); //生成 /abc
$this->createUrl(‘/abc/efg’); //生成 /abc/efg
$this->createUrl(‘abc’); //生成 /user/password/abc
$this->createUrl(‘abc/’); //生成 /user/abc
$this->createUrl(‘abc/efg’); //生成 /user/abc/efg

在layout中,由于$this就是所属的控制器,所以与上面相同。
使用Yii::app()->getController()->createUrl(),来生成URL与上面相同。
使用Yii::app()->createUrl(),这时候路由名就不会自动增加当前Module名和当前Controller名,其他的同上。
在redirect时,有时候我们需要进行用户的转向,比如登录成功就转向到用户信息界面,可以这样做:
$this->redirect(array(‘index’, ‘params01′=>’value01′, ‘params02′=>’value02′));
//redirect($url,$terminate=true,$statusCode=302)

redirect方法接受的第一个参数是一个数组,数组的第一个值就是路由名,剩下的就是所有的参数值。上面的转向URL相当于直接使用下面代码生成的URL:
$this->createUrl(‘index’, array(‘params01′=>’value01′, ‘params02′=>’value02′) );

可以看出,$this->createUrl第三个参数在redirect中是无法设置的。
而redirect方法的第二个参数$terminate表示是否执行时就终结代码的运行并立即转向,一般保持默认。
第三个参数$statusCode表示转向的时候给浏览器发送的状态代码,一般保持默认,具体的状态代码表示的意思可以Google一下“网页状态码”。
最底层:
上面所有的生成URL的方式都最终转到了下面的代码:
UrlManage::createUrl($route,$params,$ampersand);

它与Yii::app()->createUrl()唯一的不同点是后者将$route进行了整理:trim($route,’/’)
当你需要用到URL的时候,又一时不清楚参数的格式,最好的方式就是看看这个方法的代码,然后你就会恍然大悟。这也是学习和实践PHP时的好习惯。

最新文章

  1. mfc+vtk
  2. 简单理解——面向切面编程(AOP)
  3. Java对象的序列化
  4. [转]df命令
  5. Eclipse Maven Web Application 设置配置文件
  6. 【自己动手】sublime text插件开发
  7. Word2003中如何使封面和目录中不插入页码
  8. 【转载】看StackOverflow如何用25台服务器撑起5.6亿的月PV
  9. Redis数据过期策略详解
  10. 老K漫谈区块链的共识(3)——分布式系统和区块链共识
  11. Java IO流篇
  12. 01.Redis 初体验
  13. 激活函数Sigmoid、Tanh、ReLu、softplus、softmax
  14. php 将16进制数串转换为二进制数据的函数
  15. ElasticSearch 2 (33) - 信息聚合系列之聚合过滤
  16. hibernate的配置文件,使用XML方式
  17. fuzz系列之afl
  18. css笔记--用户界面样式
  19. Struts2(七)
  20. 缩进与对齐——正确地使用Tab和空格

热门文章

  1. javascript学习总结(二):DOM常用方法。
  2. 【Java基础】创建和销毁对象
  3. Windows Azure Cloud Service (37) 浅谈Cloud Service
  4. postgres中的中文分词zhparser
  5. 利用grunt-contrib-connect和grunt-connect-proxy搭建前后端分离的开发环境
  6. 【原创】Lucene.Net+盘古分词器(详细介绍)
  7. C#编程总结(十二)断点续传
  8. C# Redis使用之StackExchange
  9. 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例
  10. spring笔记4 spring MVC的基础知识4