thinkphp6.x+api知识点
Posted 「已注销」
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinkphp6.x+api知识点相关的知识,希望对你有一定的参考价值。
1.RestFul Api 编码风格
简单概念
1.传统的是采用混编(html+php)或模板(tpl)的方式进行设计
2.前后端分离主要通过后端提供 API 接口返回的 json 数据交给前端渲染;
这样,后端程序员就专心提供数据,而前端程序员拿数据专心做渲染即可;
3.RestFul Api 是一种设计风格,推荐的一种规范,有助于统一协同和管理
什么是RestFul Api 风格 参考地址
http://restful.p2hp.com/
http://www.ruanyifeng.com/blog/2014/05/restful_api.html
安装
项目安装
tp6要求的php版本为PHP >= 7.1.0
下载方式只能通过composer安装
基础的环境搭建,和composer的安装就不介绍了
1.通过composer安装thinkphp6.x
composer create-project topthink/think tpapi //安装
composer update topthink/framework //更新
2.修改hosts文件
C:\\Windows\\System32\\drivers\\etc 增加
127.0.0.1 api.tp6.com
3.启动测试命令
php think run -H api.tp6.com
4. 在.env中配置mysql连接信息
在.env
(默认没有这个只有.example.env复制一份重命名即可) 和config/database.php
中配置 mysql 的用户密码以便连接
2.资源控制器和资源路由
资源控制器
1.创建一个只用于api的接口开发的控制器
php think make:controller User --api
2.创建一个配对的User模型
php think make:model User
1.在控制器中使用尝试获取数据
在控制器index方法中尝试获取数据,具体代码如下
use app\\model\\User as UserModel;
public function index()
return UserModel::select();
然后访问
http://api.tp6.com:8000/user
然后根据给出的提示调试到正确为止
2.关于代码提示
在phpstorm中发现没有提示,这点tp6还比较坑。
如果没有代码提示,把 tp5.1 的注解可以暂时复制过来;
3. 如果在.env 中开启了调试,可看到错误提示,但出现 trace;
解决方法:关闭调试,并且在 config/app.php 中打开错误信息即可;
然后刷新后发现清楚了
资源路由
为什么第一个方法是可以的呢?因为我们没有设置强制路由,但是后面的方法就没办法了
再次访问:
定义那一个资源路由就相当于定义了以下几个路由
标识 | 请求类型 | 生成路由规则 | 对应操作方法(默认) |
---|---|---|---|
index | GET | user | index |
save | POST | user | save |
read | GET | user/:id | read |
update | PUT | user/:id | update |
delete | DELETE | user/:id | delete |
如何验证?
php think route:list
3.生成标准api
1.创建api基类
我们创建一个 Base 抽象基类,专门用于提供给子类实现 api 生成;
<?php
namespace app\\controller;
abstract class Base
protected function create($data, $msg = '', $code = 200, $type = 'json')
//返回 api 结果
$result = [
//状态码
'code' => $code,
//自定义消息
'msg' => $msg,
//数据返回
'data' => $data
];
//将数据返回成指定格式,默认 json
return \\think\\Response::create($result, $type);
2.生成api接口
通过 Base 基类的继承,我们想创建一个获取全部用户列表的 api 接口;
//获取数据列表
$data = \\app\\model\\User::field('id,username,email')->select();
//查询所有数据
return $this->create($data, $data->isEmpty() ? '数据不存在' : '数据请求成功');
查找特定主键数据,这时肯定找不到,那么就会输出数据不存在
//获取数据列表
$data = \\app\\model\\User::field('id,username,email')->select([200,201]);
//查询所有数据
return $this->create($data, $data->isEmpty() ? '数据不存在' : '数据请求成功');
4.api分页处理
1.paginate()
$data = \\app\\model\\User::field('id,username,email')->paginate(5);
发现返回的json默认自动多了几个字段,这几个值都是前端做分页必须的,有这几个字段就够了。前端还可以根据需求,把结果自己转换成他自己想要的格式,比如可以把多出的那几个字段放在第一层,data里面直接就是每页的数据等等。。
2.page()
直接采用 page()方法,这个方法来源于 limit()方法,可以手动控制的灵活些
第一个参数是页码,第二个参数是每页显示多少条
$data = \\app\\model\\User::field('id,username,email')->page($this->page,$this->pageSize)->select();
在基类中封装一下
protected $page;
protected $pageSize;
public function __construct()
//获取分页
$this->page = (int)input('page');
//获取条数
$this->pageSize = (int)input('page_size', config('pagesize.size'));
基类一般写好是不会改它的,所以默认获取条数在配置文件中给值,以后要改只需要改配置文件就行了
测试默认显示6条正确
获取第二页,也没问题。api分页教程到此结束
5.api的错误返回信息
api返回的几种方案
这里的方案比较多,可以选择一个初级简单的先应用起来;
- 200 表示成功,400 表示失败,404 表示找不到 URL 资源;
- 200 表示成功,204 表示请求成功,但无数据;400 表示请求参数错误(缺少,或不对);
- 200 表示成功,其它用自定义二级业务状态码,比如 1001,1002,-1001 等;
这里我们选择第二种方案
处理404错误
1.访问一个不存在的控制器时报错404
新建一个 Error类集成base
<?php
namespace app\\controller;
class Error extends Base
//404
public function index()
return $this->create([],'资源不存在~',404);
也可以统一生成一下注释信息
alt+insert
选择PHPDOC Blocks
然后选中需要注释的类或者方法等
2.访问一个不存在的方法的时候404处理
比如说:
所以需要加一个参数就变成访问hello方法了
框架本身也是返回的404,这个是每个控制器都要用的,所以我们在Base控制器中通过魔术方法_call
来捕获,不了解_call
的可以自己查一下资料
3.对于路由还有一种错误,就是非法请求404
http://api.tp6.com:8000/user/read/2
上面都拦截不到,可以直接用系统级的
关闭调试模式,因为它只在部署模式下会调用
会提示我们模板引擎驱动没有安装
composer安装
composer require topthink/think-view
安装后会提示我们 404.html
我们是api接口开发,直接用404.json
文件代替即可
还要记得更改http_exception_template中404指向的报错文件
再次访问,发现错误已经被捕获
2.处理204错误
这个其实很简单,但没有数据的情况,稍微修改即可
//查询所有数据
if($data->isEmpty())
return $this->create([], '没有数据',204);
else
return $this->create($data, '数据请求成功');
简单测试
3.400错误处理
见下一节
6.单数据api
如果在路由文件里约束了id,那么它会默认走404错误
我们提到400为请求错误,缺少参数或参数不正确;
public function read($id)
//判断$id 为整型
if (!Validate::isInteger($id))
return $this->create([], 'id 参数错误~', 400);
//获取数据
$data = UserModel::field('id,username,gender,email')->find($id);
//查询数据
if (empty($data))
return $this->create([], '没有数据', 204);
else
return $this->create($data, '数据请求成功', 200);
7.新增数据api
1.验证
新增一条数据,首先要进行验证,这里主要是服务器端的,用验证器即可;
使用 Postman 来模拟新增时,选择 Body 中的 form-data(表单),并用 POST;
php think make:validate User
protected $rule = [
'username|用户名' => 'require|chsDash|unique:user',
'password|密码' => 'require|min:6',
'email|邮箱' => 'require|email|unique:user'
];
2.新增数据
验证通过后,可对数据进行新增操作,具体如下:
public function save(Request $request)
//这里验证部分内容,其它自行扩展
$data = $request->param();
//验证返回
try
//验证数据
validate(UserValidate::class)->check($data);
catch (ValidateException $validateException)
//返回错误
return $this->create([], $validateException->getError(), 400);
//加密
$data['password'] = sha1($data['password']);
//注册返回数据
$id = UserModel::create($data)->getData('id');
//查询数据
if (empty($id))
return $this->create([], '注册失败~', 400);
else
return $this->create($id, '注册成功~', 200);
8.删除数据api
public function delete($id)
//判断$id 为整型
if (!Validate::isInteger($id))
return $this->create([], 'id 参数错误~', 400);
try
//delete()
UserModel::find($id)->delete();
//返回信息
return $this->create([], '数据删除成功~', 200);
catch (\\Error $e)
return $this->create([], '无法删除或数据不存在导致错误~', 400);
9.修改数据api
修改数据使用 PUT 动词提交,Postman 模拟提交使用 x-www-form-urlencoded;
这里为了简化操作,就修改邮箱,其余字段不做处理;
//获取提交数据,这里只修改邮箱
$data = $request->param();
//验证邮箱格式
try
//验证数据
validate(UserValidate::class)->scene('edit')->check($data);
catch (ValidateException $validateException)
//返回错误
return $this->create([], $validateException->getError(), 400);
//获取被修改的数据
$updateData = UserModel::find($id);
//判断邮箱和提交的邮箱是否一致
if ($data['email'] === $updateData->email)
return $this->create([], '修改的邮箱和原来的一样~', 400);
//开始修改
$id = UserModel::update($data)->getData('id');
if (empty($id))
return $this->create([], '修改失败~', 400);
else
return $this->create($id, '修改成功~', 200);
//验证场景
protected $scene = [
'edit' => ['email']
];
10.关联数据api
1. 关联数据,这里最为用一对多最为常用的数据类型来演示,首先看下路由规则;
user/:id/列表 //意为某个 id 下的所有内容,比如某人的评论列表等
//一个用户对应多个喜好的路由
Route::get('user/:id/hobby', 'User/hobby');
2. 一对多关联 API 查询,如下:
//model/User.php,一个用户关联多个喜好
public function hobby()
return $this->hasMany(Hobby::class, 'user_id', 'id');
public function hobby($id)
//判断$id 为整型
if (!Validate::isInteger($id))
return $this->create([], 'id 参数错误~', 400);
$data = UserModel::find($id)->hobby()->field('id,content')->select();
//查询数据
if ($data->isEmpty())
return $this->create($data, '没有数据', 204);
else
return $this->create($data, '数据请求成功', 200);
11.登录
首先,登录用 form 表单提交,POST 动词,验证判断两个字段的唯一性即可;
public function login(Request $request)
$data = $request->param();
//验证用户名和密码规则
$result = Validate::rule([
'username' => 'unique:user,username^password'
])->check([
'username' => $data['username'],
'password' => sha1($data['password'])
]);
//判断,反向的
if (!$result)
session('admin', $data['username']);
return $this->create(true, '登录成功~', 200);
else
return $this->create([], '用户名或密码不正确~', 400);
//登录路由
Route::post('login', 'User/login');
12.tp6.x多应用部署
坑比较多
一.多应用部署
- 首先了解下需求:PC 主站,api 接口和后台管理,这三个入口;
- 如果是只使用 api,就和前面一样,单入口即可,如果要多平台,需要多入口;
(1) .www.tp6.com:这个进入 PC 端主页;
(2) .api.tp6.com:这个专门用于 api 接口;
(3) .www.tp6.com/think:这个用于后台管理,/admin 改装的;
(4) .默认不支持多应用,需要安装这个多应用插件;
composer require topthink/think-multi-app - 更改的注意点和坑很多,对于空项目,会少一些,如果是开发了一段时间问题会多;
(1) .线上解析域名 www.tp6.com 和 api.tp6.com 至你项目的 IP 地址上;
(2) .本地测试,同时 php think run -H www.tp6.com 即可(tp6.com 部署到 hosts);
(3) .建立三个目录:index(主站,或 home),api(接口),admin(后台);
(4) .将控制器和类移入 api 应用,本身首页的控制器移入 index 应用,admin 创建一个;
(5) .config/app.php 中,需要将 404.json 单独交给 api 应用,其她用 404.html 或不用;
(6) .关于分页配置,也可以放在 api 应用里,PC 端的有自己的分页;
(7) .model 和 validate 如果是独有的,可以放在 api 应用,如果共享使用,则放在外面;
(8) .如何将 admin 改装成 think,如何将 api.tp6.com 直接引导到 api 引用中,如下:
// 应用映射(自动多应用模式有效)
'app_map' => [
'think' => 'admin'
],
// 域名绑定(自动多应用模式有效)
'domain_bind' => [
//二级域名 多应用目录
'api' => 'api'
],
以上是关于thinkphp6.x+api知识点的主要内容,如果未能解决你的问题,请参考以下文章