详解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扩展函数
Oct 09 PHP
文件上传的实现
Oct 09 PHP
PHP 伪静态隐藏传递参数名的四种方法
Feb 22 PHP
解析CodeIgniter自定义配置文件
Jun 18 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
php配合jquery实现增删操作具体实例
Dec 12 PHP
使用openssl实现rsa非对称加密算法示例
Jan 24 PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 PHP
php无序树实现方法
Jul 28 PHP
PHP无限极分类函数的实现方法详解
Apr 15 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
Jan 21 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 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
德生1994机评
2021/03/02 无线电
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
2014/06/23 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
避免Smarty与CSS语法冲突的方法
2015/03/02 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
细品javascript 寻址,闭包,对象模型和相关问题
2009/04/27 Javascript
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
jquery div 居中技巧应用介绍
2012/11/24 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
整理Python最基本的操作字典的方法
2015/04/24 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
Python 如何批量更新已安装的库
2020/05/26 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
python源文件的字符编码知识点详解
2021/03/04 Python
Java语言程序设计测试题选择题部分
2014/04/03 面试题
大学毕业感言50字
2014/02/07 职场文书
捐款倡议书
2014/04/14 职场文书
安全教育演讲稿
2014/05/09 职场文书
幼儿园庆元旦主持词
2015/07/06 职场文书
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android