博客列表 >PHP 基于 SW-X 框架,搭建高性能API架构(三)

PHP 基于 SW-X 框架,搭建高性能API架构(三)

广州PHP
广州PHP原创
2022年03月01日 11:51:42537浏览

前言

官网地址:SW-X框架-专注高性能便捷开发而生的PHP-SwooleX框架

希望各大佬举起小手,给小弟一个star:https://github.com/swoolex/swoolex

1、什么是Restful组件

在SW-X中,Restful组件是对API返回值结构的封装支持。
\x\Restful类支持定义返回值的结构、Code->Msg关联、返回值强类型转换、抛出的数据类型转换、响应的请求头定义(跨域支持)。

2、Restful的设置

API返回值的使用,主要依赖/restful/目录中的config.php配置项目,初始化默认配置如下:

  1. <?php
  2. return [
  3. // 返回值类型 支持 json|xml
  4. 'type' => 'json',
  5. // 默认的返回值格式
  6. 'default' => [
  7. 'force' => true, // 是否强制返回值 int|double|null类型转换
  8. 'status' => 'code', // 状态码字段名
  9. 'tips' => 'msg', // 描述字段名
  10. 'result' => 'data', // 结果集字段名
  11. 'set' => [], // 默认结果集
  12. 'headers' => [], // 响应头,可用于跨域设置(v2.5.23版本前支持)
  13. ],
  14. ]

其中default为默认的数据结构,当我们不使用\x\Restful::make('新的下标')指定新的返回值结构时,默认使用该结构,如果我们需要设置新的返回值结构,只需要复制default的数组结构,将下标改为新值即可。

同时,/restful/目录下还存在一个default目录,该目录是对应default默认的返回值结构,用于存放code状态码和msg状态说明。

如果设置了新的数据结构,则需要复制default目录,并重命名为对应的下标名。

下面我们来看下default目录下的两个文件:

Code状态码,/restful/default/code.php

  1. <?php
  2. // 状态码管理
  3. return [
  4. 'ERROR' => 0, // 默认失败状态码
  5. 'SUCCESS' => 1, // 默认成功状态码
  6. ];

在实际应用时,我们只需要通过\x\Restful::状态码键名()的方式来读取对应的状态码值,例如使用SUCCESS的状态码就用\x\Restful::SUCCESS()

Msg说明,/restful/default/msg.php

  1. <?php
  2. // 状态说明管理
  3. return [
  4. // 默认错误状态码对应的tips
  5. 'ERROR' => [
  6. 'default' => '请求失败', // 默认值
  7. ],
  8. // 默认成功状态码对应的tips
  9. 'SUCCESS' => [
  10. 'default' => '请求成功', // 默认值
  11. 'test' => '测试msg',
  12. ],
  13. ];

状态码说明是一个二维数组,一维下标需要对应状态码的下标,同时必须存在一个名为default的二维下标。

这样设计的初衷是由于,在实际应用中,同一个状态码可能存在多个不同的说明,这样就可以通过指定下标读取对应的说明,当不指定时,读取default下标。

例如:

  1. use x\Restful;
  2. // 读取的就是SUCCESS['default']说明,默认使用default
  3. Restful::code(Restful::SUCCESS())->callback();
  4. // 指定msg下标,读取的就是SUCCESS['test']说明
  5. Restful::code(Restful::SUCCESS())->msg('test')->callback();

3、Restful组件的更多示例

  1. use x\Restful;
  2. // 自定义msg内容
  3. return Restful::code(Restful::SUCCESS())->setMsg('把我抛出了,没用到msg.php里的配置')->callback();
  4. // 自定义抛出类型
  5. return Restful::type('xml')->code(Restful::SUCCESS())->callback();
  6. // 设置抛出的数据集
  7. return Restful::code(Restful::SUCCESS())->data([
  8. 'user_id' => 1,
  9. 'username' => 'SW-X',
  10. ])->callback();
  11. // 设置跨域支持
  12. return Restful::code(Restful::SUCCESS())->header([
  13. // 接口跨域设置
  14. 'origin' => '*',
  15. // 接口数据请求类型
  16. 'type' => '',
  17. // 接口跨域允许请求的类型
  18. 'methods' => 'POST,GET,OPTIONS,DELETE',
  19. // 接口是否允许发送 cookies
  20. 'credentials' => 'true',
  21. // 接口允许自定义请求头的字段
  22. 'headers' => 'Content-Type,Content-Length,Accept-Encoding,X-Requested-with, Origin, api_key',
  23. ])->callback();

4、在控制器中使用Restful的简单示例

接回上一篇文章,我们修改shop/select.php路由对应的控制器代码:

  1. <?php
  2. namespace app\http\v1_0_1\controller\shop;
  3. use x\controller\Http;
  4. // 引入Restful组件
  5. use x\Restful;
  6. class select extends Http
  7. {
  8. public function index() {
  9. // Restful组件抛出接口响应
  10. return Restful::code(Restful::SUCCESS())->data([
  11. 'user_id' => '1',
  12. 'username' => 'SW-X',
  13. ])->callback();
  14. }
  15. }

输出结果:

  1. {
  2. "code": 1,
  3. "msg": "请求成功",
  4. "data": {
  5. "user_id": 1,
  6. "username": "SW-X"
  7. }
  8. }

5、枚举

如果你不习惯Restful组件风格管理API接口返回值的话,SW-X还支持Enum枚举定义的方式。

枚举类必须继承至\design\Enum基类,官方建议统一定义在/box/enum/目录下,但不强制要求。

下面我们就在该目录下,创建一个ShopEnum类,代码如下:

  1. <?php
  2. namespace box\enum;
  3. // 必须继承枚举基类
  4. use design\Enum;
  5. class ShopEnum extends Enum {
  6. /*
  7. * 错误异常
  8. */
  9. const ERROR = 500;
  10. /**
  11. * 正常请求
  12. */
  13. const SUCCESS = 200;
  14. }

注意上面的注释风格,其注释内容,就是状态码对应的MSG内容。

6、枚举类的使用示例

  1. use box\enum\ShopEnum;
  2. // 获得对应的Msg内容
  3. echo ShopEnum::get(ShopEnum::ERROR);
  4. // 组装成code-msg-data的数组结构(该3个字段名都是系统固定的)
  5. ShopEnum::get(ShopEnum::ERROR, [
  6. 'data' => [
  7. 'user_id' => 1
  8. ]
  9. ]);
  10. 结果集:
  11. array(3) {
  12. ["code"]=>
  13. int(500)
  14. ["msg"]=>
  15. string(12) "错误异常"
  16. ["data"]=>
  17. array(1) {
  18. ["user_id"]=>
  19. int(1)
  20. }
  21. }
  22. // 自定义数据结构:
  23. $ret = [
  24. 'code' => ShopEnum::ERROR,
  25. 'msg' => ShopEnum::get(ShopEnum::ERROR),
  26. 'data => [],
  27. ];

7、在控制器中使用枚举的简单示例

接回上一篇文章,我们修改shop/select.php路由对应的控制器代码:

  1. <?php
  2. namespace app\http\v1_0_1\controller\shop;
  3. use x\controller\Http;
  4. // 引入自定义枚举类
  5. use box\enum\ShopEnum;
  6. class select extends Http
  7. {
  8. public function index() {
  9. $array = ShopEnum::get(ShopEnum::ERROR, [
  10. 'data' => [
  11. 'user_id' => 1
  12. ]
  13. ]);
  14. return $this->fetch(dd($array));
  15. }
  16. }

输出结果:

  1. array(3) {
  2. ["code"] => int(500)
  3. ["msg"] => string(12) "错误异常"
  4. ["data"] => array(1) {
  5. ["user_id"] => int(1)
  6. }
  7. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议