thinkPHP5框架路由常用知识点汇总


Posted in PHP onSeptember 15, 2019

本文实例讲述了thinkPHP5框架路由常用知识点。分享给大家供大家参考,具体如下:

一、路由的模式

普通模式(默认pathinfo,不解析路由)

'url_route_on' => false

混合模式(pathinfo+解析路由)

'url_route_on' => true,
'url_route_must'=> false,

强制模式(必须路由)

'url_route_on' => true,
'url_route_must' => true,

二、动态注册路由

1、动态注册路由

Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');

实例

return [
Route::rule('demo/:name/[:sex]', 'index/Index/demo', 'GET', ['ext' => 'html'], ['name' => '\w+', 'age' => '\w{1,2}']),
]

路由表达式:demo/:name/[:sex](”[]“为可选)
路由地址:/index/Index/demo
请求类型:get|post| 等
路由参数:['ext'=>'html'](后缀检测)等等
变量规则:['sex'=>'0|1'](只能为0和1)等等,正则表达式

//根路径下使用闭包
Route::get('/', function () {
 echo '我是demo3,临时维护,谢谢支持!';
}),
//301重定向
// Route::get('demo4', 'http://www.baidu.com'),

2、数组方式动态注册路由(简洁)

return [
//pattern全局变量
'__pattern__' => [
 'name' => '\w+',
 ...
],
'demo2' => 'admin/Index/demo2',
'demo3/:name/:age' => ['admin/Index/demo3', ['method' => 'get', 'ext' => 'asp'], ['age' => '\d+']],
'demo4/:name/:money' => ['admin/Index/demo4', ['method' => 'get', 'ext' => 'asp'], ['money' => '\d+']],
'demo5/:name' => ['admin/Index/demo5', ['method' => 'get', 'ext' => 'php'], []],
];

三、路由分组

个人:同一个路由定义(demo),根据URL传递参数的值的不同,而匹配不同的变量规则,从而进入不同的路由规则。例如以下

①逐条

'demo/:num' => ['admin/Index/demo1', ['method' => 'get'], ['num' => '\d{2,4}']],
'demo/:str' => ['admin/Index/demo2', ['method' => 'get'], ['str' => '[a-zA-Z]+']],
'demo/:bool' => ['admin/Index/demo3', ['method' => 'get'], ['bool' => '0|1']],

②合并

'[demo]' => [
 ':num' => ['admin/Index/demo1', ['method' => 'get'], ['num' => '\d{2,4}']],
 ':str' => ['admin/Index/demo2', ['method' => 'get'], ['str' => '[a-zA-Z]+']],
 ':bool' => ['admin/Index/demo3', ['method' => 'get'], ['bool' => '0|1']],
],

③使用group分组注册

//Route::group('路由表达式','对路由的定义');
think\Route::group('demo', [
 ':num' => ['admin/Index/demo1', ['method' => 'get'], ['num' => '\d{2,4}']],
 ':str' => ['admin/Index/demo2', ['method' => 'get'], ['str' => '[a-zA-Z]+']],
 ':bool' => ['admin/Index/demo3', ['method' => 'get'], ['bool' => '0|1']],
]);

④从③提取共同的部分——简化

think\Route::group('demo', [
 ':num' => 'demo1',
 ':str' => 'demo2',
 ':bool' => 'demo3',
], ['method' => 'get', 'prefix' => 'admin/Index/'], ['num' => '\d{2,4}', 'str' => '[a-zA-Z]+', 'bool' => '0|1']);

⑤路由分组闭包嵌套

个人:和第④的路由功能基本一致,如果不是什么特别需求或者习惯使用闭包,就少用或不用吧

Route::group(['method'=>'get','ext'=>'html'],function(){
  Route::group('blog',function(){
    Route::any('blog/:id','blog/read',[],['id'=>'\d+']);
    Route::any('blog/:name','blog/read',[],['name'=>'\w+']);
  }
});

三、路由绑定

1、绑定到模块/控制器/操作(最多绑定到操作级)

// 绑定当前的URL到 index模块
Route::bind('index');
// 绑定当前的URL到 index模块的blog控制器
Route::bind('index/blog');
// 绑定当前的URL到 index模块的blog控制器的read操作
Route::bind('index/blog/read');

个人:到目前为止路由绑定的效果使用动态注册路由没差别,不过这里不需要定义路由表达式,即简单迅捷

http://serverName/index/blog/read/id/5

http://serverName/read/id/5

个人:但路由绑定+注册路由可以将 模块、控制器、方法、传递的参数名 全部隐藏,而只注册路由的话只能隐藏 模块、控制器、传递的参数名,还存在一个路由表达式

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

http://serverName/5

2、绑定到命名空间

个人: 这一个绑定十分的省事,原先做项目时模型和控制器啥的都需要在最上面进行命名空间声明,而使用命名空间绑定,一个模块只需要两句,两个模块四句,岂不是超级全局变量?不过单从URL上来说只省略了模块这一层。

//绑定到命名空间
Route::bind('\app\index\controller','namespace');

只需

http://serverName/blog/read/id/5

就可以直接访问 \app\index\controller\Blog类的read方法。

3、绑定到类

个人:相比命名空间,这里单从URL来说省略了模块、控制器两层。类似命名空间,单这里针对的这是控制器层,而命名空间针对的是模块层

// 绑定到类
Route::bind('\app\index\controller\Blog','class');

只需

http://serverName/read/id/5

就可以直接访问 \app\index\controller\Blog类的read方法。

注:绑定到命名空间和类之后,不会进行模块的初始化工作。

4、入口文件绑定

个人:如果我们使用入口文件绑定,绑定一个模块,同时取消多模块访问配置↓,也就意味着,就算你在项目里放了再多项目也只会访问一个。想要访问其他模块只需要在入口文件改下名字即可。甚至可以使用一个空模块。将入口文件绑定为空模块将实现项目下线功能。

// 是否支持多模块
'app_multi_module' => true,

只需要入口文件添加BIND_MODULE常量,即可把当前入口文件绑定到指定的模块或者控制器,例如:

如果我们需要给某个入口文件绑定模块,可以使用下面两种方式:

①常量定义

// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 绑定到index模块
define('BIND_MODULE','index');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

②自动入口绑定

个人:顾名思义,和①功能一样,只是这个连绑定都不需要。只需要打开↓配置即可

// 入口自动绑定模块
'auto_bind_module' => false,

四、域名路由

// blog子域名绑定到blog模块
Route::domain('blog','blog');
// blog子域名绑定到blog模块,并添加默认参数
Route::domain('blog','blog?var=thinkphp');

// 原来的URL访问
http://www.thinkphp.cn/blog/article/read/id/5
// 绑定到blog子域名访问
http://blog.thinkphp.cn/article/read/id/5
// blog子域名绑定到index模块的blog控制器
Route::domain('blog','index/blog');

// 原来的URL访问
http://www.thinkphp.cn/index/blog/read/id/5
// 绑定到blog子域名访问
http://blog.thinkphp.cn/read/id/5
// 完整域名绑定到admin模块
Route::domain('admin.thinkphp.cn','admin');
// IP绑定到admin模块
Route::domain('114.23.4.5','admin');

泛域名部署

二级泛域名

// 绑定泛二级域名域名到book模块
Route::domain('*','book?name=*');

并且可以直接通过$_GET['name']变量 获取当前的泛域名。

下面的URL访问都会直接访问book模块

http://hello.thinkphp.cn
http://quickstart.thinkphp.cn

三级泛域名

// 绑定泛三级域名到user模块
Route::domain('*.user','user?name=*');

如果我们访问如下URL地址:

http://hello.user.thinkphp.cn
的同时,除了会访问user模块之外,还会默认传入 $_GET['name'] = 'hello'

在配置传入参数的时候,如果需要使用当前的泛域名作为参数,可以直接设置为“*”即可

TP5手册:https://www.kancloud.cn/manual/thinkphp5/118029

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

PHP 相关文章推荐
使用php shell命令合并图片的代码
Jun 23 PHP
深入PHP运行环境配置的详解
Jun 04 PHP
php与java通过socket通信的实现代码
Oct 21 PHP
PHP $_FILES中error返回值详解
Jan 30 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
joomla实现注册用户添加新字段的方法
May 05 PHP
php截取视频指定帧为图片
May 16 PHP
yii的入口文件index.php中为什么会有这两句
Aug 04 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
php获取客户端IP及URL的方法示例
Feb 03 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 PHP
php项目中类的自动加载实例讲解
Sep 12 #PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 #PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 #PHP
PHP实现的文件浏览器功能简单示例
Sep 12 #PHP
PHP通过文件保存和更新信息的方法分析
Sep 12 #PHP
关于Curl在Swoole协程中的解决方案详析
Sep 12 #PHP
PHP判断一个变量是否为整数、正整数的方法示例
Sep 11 #PHP
You might like
PHP4实际应用经验篇(4)
2006/10/09 PHP
让PHP支持页面回退的两种方法[转]
2007/02/14 PHP
需要注意的几个PHP漏洞小结
2012/02/05 PHP
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
详解在Python程序中使用Cookie的教程
2015/04/30 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
Python编程生成随机用户名及密码的方法示例
2017/05/05 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
python实现mean-shift聚类算法
2020/06/10 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
医学专业大学生求职的自我评价
2013/11/27 职场文书
人力资源部培训专员岗位职责
2014/01/02 职场文书
六个一活动实施方案
2014/03/21 职场文书
机关出纳岗位职责
2014/04/03 职场文书
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL