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 中的一些经验积累
Oct 09 PHP
怎样去阅读一份php源代码
Aug 21 PHP
9个PHP开发常用功能函数小结
Jul 15 PHP
PHP中使用crypt()实现用户身份验证的代码
Sep 05 PHP
php实现邮件发送并带有附件
Jan 24 PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 PHP
ThinkPHP实现一键清除缓存方法
Jun 26 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
php实现转换html格式为文本格式的方法
May 16 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
Apr 27 PHP
实例讲解PHP页面静态化
Feb 05 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Mar 09 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
PHP中数据类型转换的三种方式
2015/04/02 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
JS全角与半角转化实例(分享)
2017/07/04 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
python 图片验证码代码分享
2012/07/04 Python
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
Python开发的实用计算器完整实例
2017/05/10 Python
详解python的webrtc库实现语音端点检测
2017/05/31 Python
ubuntu17.4下为python和python3装上pip的方法
2018/06/12 Python
django多个APP的urls设置方法(views重复问题解决)
2019/07/19 Python
python 实现控制鼠标键盘
2020/11/27 Python
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
意大利包包和行李箱销售网站:Bagaglio.it
2021/03/02 全球购物
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
大学生求职自荐信
2013/12/12 职场文书
小组名称和口号
2014/06/09 职场文书
珍惜资源的建议书
2014/08/26 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers