Blogger Information
Blog 12
fans 0
comment 0
visits 8774
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 基于 SW-X 框架,搭建高性能API架构(三)
广州PHP
Original
538 people have browsed it

前言

官网地址: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. }
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post