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 中打开错误信息即可;


然后刷新后发现清楚了

资源路由

为什么第一个方法是可以的呢?因为我们没有设置强制路由,但是后面的方法就没办法了



再次访问:

定义那一个资源路由就相当于定义了以下几个路由

标识请求类型生成路由规则对应操作方法(默认)
indexGETuserindex
savePOSTusersave
readGETuser/:idread
updatePUTuser/:idupdate
deleteDELETEuser/:iddelete

如何验证?

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返回的几种方案

这里的方案比较多,可以选择一个初级简单的先应用起来;

  1. 200 表示成功,400 表示失败,404 表示找不到 URL 资源;
  2. 200 表示成功,204 表示请求成功,但无数据;400 表示请求参数错误(缺少,或不对);
  3. 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多应用部署

坑比较多

一.多应用部署

  1. 首先了解下需求:PC 主站,api 接口和后台管理,这三个入口;
  2. 如果是只使用 api,就和前面一样,单入口即可,如果要多平台,需要多入口;
    (1) .www.tp6.com:这个进入 PC 端主页;
    (2) .api.tp6.com:这个专门用于 api 接口;
    (3) .www.tp6.com/think:这个用于后台管理,/admin 改装的;
    (4) .默认不支持多应用,需要安装这个多应用插件;
    composer require topthink/think-multi-app
  3. 更改的注意点和坑很多,对于空项目,会少一些,如果是开发了一段时间问题会多;
    (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知识点的主要内容,如果未能解决你的问题,请参考以下文章

四级语法

ThinkPhp6.x+Vue后台管理系统

ThinkPhp6.x+Vue后台管理系统

ThinkPhp6.x+Vue前后端分离后台管理系统

开源国产数据库峰会-南京站(8月15日)

基于ThinkPhp6.x+Vue+AntDesign低代码开发平台