详解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 相关文章推荐
html中select语句读取mysql表中内容
Oct 09 PHP
发布一个用PHP fsockopen写的HTTP下载的类
Feb 22 PHP
数据库查询记录php 多行多列显示
Aug 15 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
windwos下使用php连接oracle数据库的过程分享
May 26 PHP
smarty中英文多编码字符截取乱码问题解决方法
Oct 28 PHP
PHP微信开发之二维码生成类
Jun 26 PHP
php自动载入类用法实例分析
Jun 24 PHP
实例介绍PHP中zip_open()函数用法
Feb 15 PHP
thinkphp框架类库扩展操作示例
Nov 26 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 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的分页功能
2007/03/21 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
jQuery代码优化之基本事件
2011/11/01 Javascript
javascript中clone对象详解
2014/12/03 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
浅谈Vue路由快照实现思路及其问题
2018/06/07 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
python绘制中国大陆人口热力图
2018/11/07 Python
python实现简单飞行棋
2020/02/06 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
STP的判定过程
2012/10/01 面试题
Ruby如何进行文件操作
2014/07/17 面试题
党员教师工作决心书
2014/03/13 职场文书
就业协议书的作用
2014/04/11 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
员工辞职信怎么写
2015/02/27 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server