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 相关文章推荐
珊瑚虫IP库浅析
Feb 15 PHP
phpMyAdmin链接MySql错误 个人解决方案
Dec 28 PHP
解析php中static,const与define的使用区别
Jun 18 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
Nov 28 PHP
php function用法如何递归及return和echo区别
Mar 07 PHP
学习php设计模式 php实现状态模式
Dec 07 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
Mar 08 PHP
CI映射(加载)数据到view层的方法
Mar 28 PHP
Joomla使用Apache重写模式的方法
May 04 PHP
Smarty3配置及入门语法
Feb 22 PHP
PHP实现的文件浏览器功能简单示例
Sep 12 PHP
Laravel中如何轻松容易的输出完整的SQL语句
Jul 26 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
77A一级收信机修理记
2021/03/02 无线电
如何正确理解PHP的错误信息
2006/10/09 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
浅谈使用 PHP 进行手机 APP 开发(API 接口开发)
2014/08/11 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
javascript中的作用域scope介绍
2010/12/28 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
jQuery旋转插件jqueryrotate用法详解
2016/10/13 Javascript
解决vue点击控制单个样式的问题
2018/09/05 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
文史专业毕业生自荐信
2013/11/17 职场文书
学年自我鉴定
2014/01/16 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
英文慰问信范文
2015/03/24 职场文书
2015年小学生国庆节演讲稿
2015/07/30 职场文书
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js
vue修饰符.capture和.self的区别
2022/04/22 Vue.js