tp5.1写rest api接口
2021-12-20 09:03:55 0 举报
AI智能生成
登录查看完整内容
php tp5.1
作者其他创作
大纲/内容
tp5.1写rest api接口
外框
模块,路由,获取请求参数
构建验证层
全局异常处理
数据库操作
模型
模型关联
一对一
一对多
多对多
读取器
登录与令牌
额外知识点
rest和restful
aop
orm
1,模块,路由,获取请求参数
模块
1,所有模块的命名空间均以app作为根命名空间(可通过环境变量更改)。
// index模块的Index控制器类app\\index\\controller\\Index// index模块的User模型类app\\index\\model\\User
2,其中common模块是一个特殊的模块,默认是禁止直接访问的,一般用于放置一些公共的类库用于其他模块的继承。
https://www.kancloud.cn/manual/thinkphp5_1/353956
路由
2,请求类型参数不区分大小写。
GET\tGET请求\tgetPOST\tPOST请求\tpostPUT\tPUT请求\tputDELETE\tDELETE请求\tdeletePATCH\tPATCH请求\tpatch*\t任何请求类型\tany
4,快捷路由
5,常规匹配
6,可选匹配
可选参数只能放到路由规则的最后,如果在中间使用了可选参数的话,后面的变量都会变成可选参数。
7,完全匹配
规则匹配检测的时候默认只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望URL进行完全匹配,可以在路由表达式最后使用$符号
8,变量规则
系统默认的变量规则设置是\\w+,只会匹配字母、数字和下划线字符,并不会匹配特殊符号和中文,需要定义变量规则或者调整默认变量规则。
不需要开头添加^或者在最后添加$,也不支持模式修饰符,系统会自动添加。
9,局部变量规则
10,全局变量规则
11,组合变量规则
12,动态路由
13,闭包定义
14,依赖注入(使用其他类)
15,路由参数
https://www.kancloud.cn/manual/thinkphp5_1/353965
16,请求变量检测(V5.1.16+)
17,设置Header信息
18,路由跨域
19,路由分组
20,全局MISS路由--》没有匹配到所有路由的情况下
Route::miss('public/miss');
一旦设置了MISS路由,相当于开启了强制路由模式
21,分组miss路由
获取请求参数
当前的请求对象由think\\Request类负责,在很多场合下并不需要实例化调用,通常使用依赖注入即可。在其它场合(例如模板输出等)则可以使用think\\facade\\Request静态类操作。
use think\\facade\\Request;// 获取完整URL地址 不带域名Request::url();// 获取完整URL地址 包含域名Request::url(true);// 获取当前URL(不含QUERY_STRING) 不带域名Request::baseFile();// 获取当前URL(不含QUERY_STRING) 包含域名Request::baseFile(true);// 获取URL访问根地址 不带域名Request::root();// 获取URL访问根地址 包含域名Request::root(true);
检测变量是否设置
变量获取
use think\\facade\\Request;// 获取当前请求的name变量Request::param('name');// 获取当前请求的所有变量(经过过滤)Request::param();// 获取当前请求的所有变量(原始数据)Request::param(false);// 获取当前请求的所有变量(包含上传文件)Request::param(true);
变量修饰符
修饰符\t作用s\t强制转换为字符串类型d\t强制转换为整型类型b\t强制转换为布尔类型a\t强制转换为数组类型f\t强制转换为浮点类型下面是一些例子:
Request::get('id/d');Request::post('name/s');Request::post('ids/a');
助手函数
为了简化使用,还可以使用input助手函数完成上述大部分功能。
判断变量是否定义
input('?get.id');input('?post.name');
获取PARAM参数
input('param.name'); // 获取单个参数input('param.'); // 获取全部参数// 下面是等效的input('name'); input('');
获取GET参数
// 获取单个变量input('get.id');// 使用过滤方法获取 默认为空字符串input('get.name');// 获取全部变量input('get.');
使用过滤方法
使用变量修饰符(强制类型学转换)
input('get.id/d');input('post.name/s');input('post.ids/a');
请求类型
请求对象Request类提供了下列方法来获取或判断当前请求类型:用途\t方法获取当前请求类型\tmethod判断是否GET请求\tisGet判断是否POST请求\tisPost判断是否PUT请求\tisPut判断是否DELETE请求\tisDelete判断是否AJAX请求\tisAjax判断是否PJAX请求\tisPjax判断是否为JSON请求\tisJson(V5.1.38+)判断是否手机访问\tisMobile判断是否HEAD请求\tisHead判断是否PATCH请求\tisPatch判断是否OPTIONS请求\tisOptions判断是否为CLI执行\tisCli判断是否为CGI模式\tisCgi
获取header信息
$info = Request::header();echo $info['accept'];echo $info['accept-encoding'];echo $info['user-agent'];
$agent = Request::header('user-agent');
2,构建验证层
1,验证器
验证数据验证规则全部数据(数组)字段名字段描述
验证规则
两种方式
常通过rule属性定义验证规则
而如果使用的是独立验证的话,则是通过rule方法进行定义。
验证场景
内置规则
自定义
正则
系统自带
闭包验证
make方法直接传入验证规则(数组)
check方法传入需要验证的数据(数组)。
3,全局异常处理(也可以理解为返回的信息,也就是说也返回正确的信息)
4,日志(一般将异常写入日志,当然了,开发时吧sql语句也写进入,有利于提高)
5,数据库
增
insert 方法添加数据成功返回添加成功的条数,通常情况返回 1
添加数据后如果需要返回新增数据的自增主键,可以使用insertGetId方法新增数据并返回主键值:$userId = Db::name('user')->insertGetId($data);
添加多条数据
改
update 方法返回影响数据的条数,没修改任何数据返回 0
如果update方法和data方法同时传入更新数据,则会进行合并。
加减
可以使用setInc/setDec方法自增或自减一个字段的值( 如不加第二个参数,默认步长为1)。
setInc/setDec 方法返回影响数据的条数,如果使用了延迟更新的话,可能会返回true
删
span style=\
软删除
查
查询
基本查询
助手函数
db
值和列查询
查询某个字段的值可以用
只能穿一个
查询某一列的值可以用
常用查询
等于(=)
不等于(<>)
[NOT] LIKE: 同sql的LIKE
like查询支持使用数组
[NOT] BETWEEN :同sql的[not] between
[NOT] NULL :查询字段是否(不)是Null,例如:
EXP:表达式
exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。
链式操作
wheretablealiasfieldstrictlimitpageordergrouphavingjoinuniondistinctlockcachecommentfetchSqlforcepartitionfailExceptionsequence
获取器
数据集
V5.1.23+版本开始,你可以在查询的时候指定是否需要返回数据集(无需配置resultset_type参数)
// 获取数据集$users = Db::name('user')->fetchCollection()->select();// 直接操作第一个元素$item = $users[0];// 获取数据集记录数$count = count($users);// 遍历数据集foreach($users as $user){ echo $user['name']; echo $user['id'];}
需要注意的是,如果要判断数据集是否为空,不能直接使用empty判断,而必须使用数据集对象的isEmpty方法判断,例如:
$users = Db::name('user')->select();if($users->isEmpty()){ echo '数据集为空';}
方法\t描述isEmpty\t是否为空toArray\t转换为数组all\t所有数据merge\t合并其它数据diff\t比较数组,返回差集flip\t交换数据中的键和值intersect\t比较数组,返回交集keys\t返回数据中的所有键名pop\t删除数据中的最后一个元素shift\t删除数据中的第一个元素unshift\t在数据开头插入一个元素reduce\t通过使用用户自定义函数,以字符串返回数组reverse\t数据倒序重排chunk\t数据分隔为多个数据块each\t给数据的每个元素执行回调filter\t用回调函数过滤数据中的元素column\t返回数据中的指定列sort\t对数据排序shuffle\t将数据打乱slice\t截取数据中的一部分
6,模型
定义
name\t模型名(默认为当前不含后缀的模型类名)table\t数据表名(默认自动获取)pk\t主键名(默认为id)connection\t数据库连接(默认读取数据库配置)query\t模型使用的查询类名称field\t模型对应数据表的字段列表(数组)
新增
$user = new User;$user->name = 'thinkphp';$user->email = 'thinkphp@qq.com';$user->save();
save方法返回影响的记录数,并且只有当before_insert事件返回false的时候返回false,从V5.1.6+版本开始统一返回布尔值
$user = new User;// 过滤post数组中的非数据表字段数据$user->allowField(true)->save($_POST);
获取自增ID
这里其实是获取模型的主键,如果你的主键不是id,而是user_id的话,其实获取自增ID就变成这样:
$user = new User;$user->name = 'thinkphp';$user->email = 'thinkphp@qq.com';$user->save();// 获取自增IDecho $user->user_id;
saveAll方法新增数据默认会自动识别数据是需要新增还是更新操作,当数据中存在主键的时候会认为是更新操作,如果你需要带主键数据批量新增,可以使用下面的方式:
静态方法
create方法的第二个参数可以传入允许写入的字段列表(传入true则表示仅允许写入数据表定义的字段数据),例如
新增数据的最佳实践原则:使用create方法新增数据,使用saveAll批量新增数据。
直接更新
过滤非数据表字段的数据
批量更新数据
可以使用saveAll方法批量更新数据,只需要在批量更新的数据中包含主键即可,例如:
批量更新方法返回的是一个数据集对象。
批量更新仅能根据主键值进行更新,其它情况请自行处理。
数据库的update方法返回影响的记录数
更新的最佳实践原则是:如果需要使用模型事件,那么就先查询后更新,如果不需要使用事件,直接使用静态的Update方法进行条件更新,如非必要,尽量不要使用批量更新。
删除
$user = User::get(1);$user->delete();
子主题
h2 style=\
或者直接调用静态方法(根据主键删除)
条件删除
删除的最佳实践原则是:如果删除当前模型数据,用delete方法,如果需要直接删除数据,使用destroy静态方法。
获取多条数据
获取单条数据
获取某个字段或者某个列的值
value和column方法返回的不再是一个模型对象实例,而是纯粹的值或者某个列的数组。
动态查询
// 根据name字段查询用户$user = User::getByName('thinkphp');// 根据email字段查询用户$user = User::getByEmail('thinkphp@qq.com');
模型查询的最佳实践原则是:在模型外部使用静态方法进行查询,内部使用动态方法查询,包括使用数据库的查询构造器。模型的查询始终返回对象实例,但可以和数组一样使用。
获取器还可以定义数据表中不存在的字段,例如:
$user = User::get(1);// 通过获取器获取字段echo $user->status;// 获取原始字段数据echo $user->getData('status');// 获取全部原始数据dump($user->getData());
动态获取器
修改器
搜索器
搜索器通常会和查询范围进行比较,搜索器无论定义了多少,只需要一次调用,查询范围如果需要组合查询的时候就需要多次调用。
类型转换
概要
0 条评论
回复 删除
下一页