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 相关文章推荐
Oracle 常见问题解答
Oct 09 PHP
第四节 构造函数和析构函数 [4]
Oct 09 PHP
PHP设计聊天室步步通
Oct 09 PHP
PHP5 面向对象程序设计
Feb 13 PHP
discuz论坛 用户登录 后台程序代码
Nov 27 PHP
PHP 函数执行效率的小比较
Oct 17 PHP
php+js实现图片的上传、裁剪、预览、提交示例
Aug 27 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
Apr 21 PHP
php表单请求获得数据求和示例
May 15 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
Jun 23 PHP
PHP使用imagick扩展实现合并图像的方法
Apr 25 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
Aug 10 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 filter_var() 函数 Filter 函数
2012/04/25 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
2013/08/06 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
socket.io实现在线群聊功能
2017/04/07 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
2017/08/08 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
用Python编写一个国际象棋AI程序
2014/11/28 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
Python元组及文件核心对象类型详解
2018/02/11 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
白色公司:The White Company
2017/10/11 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
企业出纳岗位职责
2014/03/12 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
物业管理工作方案
2014/05/10 职场文书
学校安全生产承诺书
2014/05/23 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
js实现自动锁屏功能
2021/06/02 Javascript
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers