tp5.1 框架路由操作-URL生成实例分析


Posted in PHP onMay 26, 2020

本文实例讲述了tp5.1 框架路由操作-URL生成。分享给大家供大家参考,具体如下:

ThinkPHP支持路由URL地址的统一生成,并且支持所有的路由方式,以及完美解决了路由地址的反转解析,无需再为路由定义和变化而改变URL生成。

如果你开启了路由延迟解析,需要生成路由映射缓存才能支持全部的路由地址的反转解析。

URL生成使用 \think\facade\Url::build() 方法或者使用系统提供的助手函数url(),参数一致:

Url::build('地址表达式',['参数'],['URL后缀'],['域名'])

url('地址表达式',['参数'],['URL后缀'],['域名'])

地址表达式和参数

对使用不同的路由地址方式,地址表达式的定义有所区别。参数单独通过第二个参数传入,假设我们定义了一个路由规则如下:

Route::rule('blog/:id','index/blog/read');

就可以使用下面的方式来生成URL地址:

Url::build('index/blog/read', 'id=5&name=thinkphp');
Url::build('index/blog/read', ['id' => 5, 'name' => 'thinkphp']);
url('index/blog/read', 'id=5&name=thinkphp');
url('index/blog/read', ['id' => 5, 'name' => 'thinkphp']);

使用模块/控制器/操作生成

如果你的路由方式是路由到模块/控制器/操作,那么可以直接写

// 生成index模块 blog控制器的read操作 URL访问地址
Url::build('index/blog/read', 'id=5&name=thinkphp');
// 使用助手函数
url('index/blog/read', 'id=5&name=thinkphp');

以上方法都会生成下面的URL地址:

/index.php/blog/5/name/thinkphp.html

注意,生成方法的第一个参数必须和路由定义的路由地址保持一致,如果写成下面的方式可能无法正确生成URL地址:

Url::build('blog/read','id=5&name=thinkphp');

如果你的环境支持REWRITE,那么生成的URL地址会变为:

/blog/5/name/thinkphp.html

如果你配置了:

'url_common_param'=>true

那么生成的URL地址变为:

/index.php/blog/5.html?name=thinkphp

不在路由规则里面的变量会直接使用普通URL参数的方式。

需要注意的是,URL地址生成不会检测路由的有效性,只是按照给定的路由地址和参数生成符合条件的路由规则。

使用控制器的方法生成

如果你的路由地址是采用控制器的方法,并且路由定义如下:

// 这里采用配置方式定义路由 动态注册的方式一样有效
Route::get('blog/:id', '@index/blog/read');

那么可以使用如下方式生成:

// 生成index模块 blog控制器的read操作 URL访问地址
Url::build('@index/blog/read', 'id=5');
// 使用助手函数
url('@index/blog/read', 'id=5');

那么自动生成的URL地址变为:

/index.php/blog/5.html

使用类的方法生成

如果你的路由地址是路由到类的方法,并且做了如下路由规则定义:

// 这里采用配置方式定义路由 动态注册的方式一样有效
Route::rule(['blog','blog/:id'],'\app\index\controller\blog@read');

如果路由地址是到类的方法,需要首先给路由定义命名标识,然后使用标识快速生成URL地址。

那么可以使用如下方式生成:

// 生成index模块 blog控制器的read操作 URL访问地址
Url::build('blog?id=5');
url('blog?id=5');

那么自动生成的URL地址变为:

/index.php/blog/5.html

直接使用路由地址

我们也可以直接使用路由地址来生成URL,例如:

我们定义了路由规则如下:

Route::get('blog/:id' , 'index/blog/read');

可以使用下面的方式直接使用路由规则生成URL地址:

Url::build('/blog/5');

那么自动生成的URL地址变为:

/index.php/blog/5.html

URL后缀

默认情况下,系统会自动读取url_html_suffix配置参数作为URL后缀(默认为html),如果我们设置了:

'url_html_suffix' => 'shtml'

那么自动生成的URL地址变为:

/index.php/blog/5.shtml

如果我们设置了多个URL后缀支持

'url_html_suffix' => 'html|shtml'

则会取第一个后缀来生成URL地址,所以自动生成的URL地址还是:

/index.php/blog/5.html

如果你希望指定URL后缀生成,则可以使用:

Url::build('index/blog/read', 'id=5', 'shtml');
url('index/blog/read', 'id=5', 'shtml');

域名生成

默认生成的URL地址是不带域名的,如果你采用了多域名部署或者希望生成带有域名的URL地址的话,就需要传入第四个参数,该参数有两种用法:

自动生成域名

Url::build('index/blog/read', 'id=5', 'shtml', true);
url('index/blog/read', 'id=5', 'shtml', true);

第四个参数传入true的话,表示自动生成域名,如果你开启了url_domain_deploy还会自动识别匹配当前URL规则的域名。

例如,我们注册了域名路由信息如下:

Route::domain('blog','index/blog');

那么上面的URL地址生成为:

http://blog.thinkphp.cn/read/id/5.shtml

指定域名

你也可以显式传入需要生成地址的域名,例如:

Url::build('index/blog/read','id=5','shtml','blog');
url('index/blog/read','id=5','shtml','blog');

或者传入完整的域名

Url::build('index/blog/read','id=5','shtml','blog.thinkphp.cn');
url('index/blog/read','id=5','shtml','blog.thinkphp.cn');

生成的URL地址为:

http://blog.thinkphp.cn/read/id/5.shtml

也可以直接在第一个参数里面传入域名,例如:

Url::build('index/blog/read@blog', 'id=5');
url('index/blog/read@blog', 'id=5');
url('index/blog/read@blog.thinkphp.cn', 'id=5');

生成锚点

支持生成URL的锚点,可以直接在URL地址参数中使用:

Url::build('index/blog/read#anchor@blog','id=5');
url('index/blog/read#anchor@blog','id=5');

 

锚点和域名一起使用的时候,注意锚点在前面,域名在后面。

生成的URL地址为:

http://blog.thinkphp.cn/read/id/5.html#anchor

隐藏或者加上入口文件

有时候我们生成的URL地址可能需要加上index.php或者去掉index.php,大多数时候系统会自动判断,如果发现自动生成的地址有问题,可以直接在调用build方法之前调用root方法,例如加上index.php

Url::root('/index.php');
Url::build('index/blog/read','id=5');

或者隐藏index.php

Url::root('/');
Url::build('index/blog/read','id=5');

root方法只需要调用一次即可。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
模仿OSO的论坛(五)
Oct 09 PHP
php中用文本文件做数据库的实现方法
Mar 27 PHP
php jquery 实现新闻标签分类与无刷新分页
Dec 18 PHP
GBK的页面输出JSON格式的php函数
Feb 16 PHP
PHP curl模拟浏览器采集阿里巴巴的实现代码
Apr 20 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
Jul 02 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
Sep 30 PHP
thinkphp使用literal防止模板标签被解析的方法
Nov 22 PHP
php数组转成json格式的方法
Mar 09 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 PHP
tp5.1 框架join方法用法实例分析
May 26 #PHP
tp5.1框架数据库子查询操作实例分析
May 26 #PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
May 26 #PHP
Laravel 修改验证异常的响应格式实例代码详解
May 25 #PHP
tp5.1 框架查询表达式用法详解
May 25 #PHP
tp5.1 框架数据库高级查询技巧实例总结
May 25 #PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 #PHP
You might like
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
php教程之魔术方法的使用示例(php魔术函数)
2014/02/12 PHP
PHP实现一维数组转二维数组的方法
2015/02/25 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
从零学Python之入门(五)缩进和选择
2014/05/27 Python
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
Python中%r和%s的详解及区别
2017/03/16 Python
python @property的用法及含义全面解析
2018/02/01 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
python3实现多线程聊天室
2018/12/12 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
Python OpenCV实现测量图片物体宽度
2020/05/27 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
编写类String的构造函数、析构函数和赋值函数
2012/05/29 面试题
商场消防演习方案
2014/02/12 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
失职检讨书大全
2015/01/26 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
2016寒假假期总结
2015/10/10 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
详解如何使用Nginx解决跨域问题
2022/05/06 Servers