详解Yii2 之 生成 URL 的方法


Posted in PHP onJune 16, 2017

前言

在项目中,推荐使用 Yii2 内置的 URL 工具类生成链接,这样可以非常便捷的管理整站的 URL 行为:比如通过修改配置改变整站的URL格式等。URL 更多高级的用法参见官方文档,这篇文章仅仅介绍 Yii2 生成 URL 的几种方式。

Yii2 默认的 URL 链接格式

Yii2 默认的 URL 链接格式是指为开启 URL 美化时的格式。

未启用子模块的 URL 格式:

// 参数 r 中的 article 表示控制器, view 表示动作
http://www.example.com/index.php?r=article/view&id=100

启用了子模块的 URL 格式:

// 参数 r 中的 kernel 表示子模块
http://www.example.com/index.php?r=kernel/article/view&id=100

Yii2 内置的 URL 生成工具

  1. URL 管理器:urlManager
  2. URL 助手类:yii\helpers\Url

使用内置的 URL 生成工具,以后可以在不改变源码的情况通过配置即可美化整站的 URL

URL 管理器

URL 管理器是一个名叫 urlManager 的内置应用组件。在 WEB 应用和控制台应用中以通过以下两种方式创建 URL:

  1. \Yii::$app->urlManager->createUrl($params)
  2. \Yii::$app->urlManager->createAbsoluteUrl($params, $schema = null)

createUrl 方法生成根目录的相对路径,例如:/index.php?r=article/view

createAbsoluteUrl() 方法生成的是绝对路径,例如:http://www.example.com/index.php?r=article/view

常见的利用 URL 管理器创建 URL 的例子:

// URL:/index.php?r=article/view
\Yii::$app->urlManager->createUrl('article/view');

// URL:/index.php?r=article/view&id=2
\Yii::$app->urlManager->createUrl(['article/view','id'=>2]);

// URL: http://www.example.com?r=kernel/article/view
echo \Yii::$app->urlManager->createAbsoluteUrl('kernel/article/view');

URL 助手类

相对于 URL管理器,使用 yii\helpers\Url 助手类可大大简化 URL 的创建。

1. 假设当前 URL /index.php?r=kernel/article/view&id=10,以下说明 URL 助手类 Url::to() 是如何工作的(不推荐):

// 创建当前 URL
// 显示:/?r=kernel/article/view&id=10
echo Url::to();

// 创建当前 URL
// 显示:http://www.example.com/?r=kernel/article/view&id=10
echo Url::to('', true);

// 字符参数,没啥用
// 显示:kernel/article/view
echo Url::to('kernel/article/view');

// 创建路由,数组参数的自动调用 Url::toRoute(...)
// 显示:/index.php?r=kernel/article/view
echo Url::to(['article/view']);

2. 假设当前 URL /index.php?r=kernel/article/view&id=10,以下说明 URL 助手类 Url::toRoute() 方法是如何工作的(推荐):

// 创建当前路由(仅继承参数r的值)
// 显示:/index.php?r=kernel/article/view
echo Url::toRoute([]);

// 相同的模块和控制器,不同的动作(仅继承参数r的值)
// 显示:/index.php?r=kernel/article/list
echo Url::toRoute('list');

// 相同的模块和控制器,不同的动作(仅继承参数r的值)
// 显示:/index.php?r=kernel/article/list&cat=contact
echo Url::toRoute(['list','cat'=>10]);

// 相同模块,不同控制器和动作(仅继承参数r的值)
// 显示:/index.php?r=kernel/product/index
echo Url::toRoute('product/index');

// 绝对路由,不管是被哪个模块和控制器调用
// 显示:/index.php?r=product/index
echo Url::toRoute('/product/index');

// 控制器动作 `actionListHot` 的 URL 格式(仅继承参数r的值,区分大小写)
// 显示:/index.php?r=kernel/article/list-hot
echo Url::toRoute('list-hot');

// 从别名中获取 URL 
// 显示:http://www.baidu.com/
Yii::setAlias('@baidu', 'http://www.baidu.com/');
echo Url::to('@baidu');

3. 假设当前 URL /index.php?r=kernel/article/view&id=10,以下说明 URL 助手类 Url::current() 方法是如何工作的(推荐):

// 创建当前 URL(包括路由和参数)
// 显示:/?r=kernel/article/view&id=10
echo Url::current();

// 移除参数 id
// 显示:/?r=kernel/article/view
echo Url::current(['id'=>null]);

// 新增参数 cat
// 显示:/?r=kernel/article/view&id=10&cat=2
echo Url::current(['cat'=>2]);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
解析PHP高效率写法(详解原因)
Jun 20 PHP
PHP include任意文件或URL介绍
Apr 29 PHP
php计算程序运行时间的简单例子分享
May 10 PHP
php5.2以下版本无json_decode函数的解决方法
May 25 PHP
php防止用户重复提交表单
Nov 02 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
May 06 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
php车辆违章查询数据示例
Oct 14 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
Jun 16 #PHP
php使用str_replace替换多维数组的实现方法分析
Jun 15 #PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
Jun 15 #PHP
php7基于递归实现删除空文件夹的方法示例
Jun 15 #PHP
php实现的二叉树遍历算法示例
Jun 15 #PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 #PHP
PHP中phar包的使用教程
Jun 14 #PHP
You might like
PHP常用处理静态操作类
2015/04/03 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
javascript 单选框,多选框美化代码
2008/08/01 Javascript
js获取视频时长代码
2014/04/10 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
2018/02/24 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
Python Queue模块详解
2014/11/30 Python
python 排序算法总结及实例详解
2016/09/28 Python
python最长回文串算法
2018/06/04 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
通过代码实例了解Python sys模块
2020/09/14 Python
python实现扫雷游戏的示例
2020/10/20 Python
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
简历中自我评价分享
2013/10/09 职场文书
关于期中考试的反思
2014/02/02 职场文书
2014年党委工作总结
2014/11/22 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
小学教代会开幕词
2016/03/04 职场文书
Nginx配置Https安全认证的实现
2021/05/26 Servers
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
Go语言应该什么情况使用指针
2021/07/25 Golang