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

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

广州PHP
广州PHP原创
2022年03月04日 10:25:06623浏览

前言

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

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

1、404接口配置

HTTP服务中,当查找不到对应的路由时,会加载/config/route.php配置文件中的404配置。

以下为具体的参数配置项:

  1. <?php
  2. return [
  3. // 找不到路由的时候,是否启用自定义的错误处理程序
  4. '404' => true,
  5. // 自定义的错误处理程序,只需要提供一个类的命名空间位置即可
  6. 'error_class' => '\\box\\http_error',
  7. ];

下面我们打开/box/http_error.php文件,并修改成以下代码:

  1. <?php
  2. namespace box;
  3. use \x\controller\Http;
  4. class http_error extends Http{
  5. /**
  6. * 入口
  7. * @todo 无
  8. * @author 小黄牛
  9. * @version v1.0.1 + 2020.05.29
  10. * @deprecated 暂不启用
  11. * @global 无
  12. * @return void
  13. */
  14. public function __construct() {
  15. return \x\Restful::code(\x\Restful::ONROUTE())->callback();
  16. }
  17. }

由于上面使用\x\Restful组件,抛出了一个ONROUTE状态码,所以对应的Restful配置也要进行修改:

/restful/default/code.php修改成如下代码:

  1. <?php
  2. return [
  3. 'ERROR' => 0, // 默认失败状态码
  4. 'SUCCESS' => 1, // 默认成功状态码
  5. 'ACTION_ERROR' => 40001, // 权限校验失败
  6. 'ONROUTE' => 40004, // 不存在的接口
  7. ];

/restful/default/msg.php修改成如下代码:

  1. <?php
  2. return [
  3. // 默认错误状态码对应的tips
  4. 'ERROR' => [
  5. 'default' => '请求失败', // 默认值
  6. ],
  7. // 默认成功状态码对应的tips
  8. 'SUCCESS' => [
  9. 'default' => '请求成功', // 默认值
  10. 'test' => '测试msg',
  11. ],
  12. // 权限校验失败
  13. 'ACTION_ERROR' => [
  14. 'default' => '权限校验失败', // 默认值
  15. ],
  16. // 不存在的接口
  17. 'ONROUTE' => [
  18. 'default' => '该接口不存在', // 默认值
  19. ],
  20. ];

这时候我们随便访问一个不存在的接口,http://IP地址:端口/api/user/info,就可以看到框架抛出了下面的状态码:

  1. {
  2. "code": 40004,
  3. "msg": "该接口不存在",
  4. "data": []
  5. }

2、请求类型限制

SW-X中需要限制某个HTTP控制器的请求类型有多种方式,

第1种是使用@Post@Get@Ajax注解进行限制。

第2种,则是使用\x\Validate验证器组件,对请求头进行判断过滤。

一般建议使用第1种方式,因为非常灵活,而第2种一般是用于对某些同组接口需要进行相同请求头过滤,例如签名判断等业务时使用。

下面,我们将/app/http/v1_0_1/controller/shop/delete.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 delete extends Http
  7. {
  8. /**
  9. * 我只允许Post+Ajax的请求
  10. * @Post
  11. * @Ajax
  12. */
  13. public function index() {
  14. // Restful组件抛出接口响应
  15. return Restful::code(Restful::SUCCESS())->data('您的请求通过啦')->callback();
  16. }
  17. }

同时,由于该注解的错误信息是由/box/lifecycle/route_error.php生命周期文件进行回调处理,所以我们还需要将该文件改成以下代码:

  1. <?php
  2. namespace box\lifecycle;
  3. class route_error
  4. {
  5. /**
  6. * 特殊转换3种注解的Msg值
  7. */
  8. private $tips = [
  9. 'Route Method Get' => '只允许Get请求',
  10. 'Route Method Post' => '只允许Post请求',
  11. 'Route Method Ajax' => '只允许Ajax请求',
  12. ];
  13. /**
  14. * 接受回调处理
  15. * @todo 无
  16. * @author 小黄牛
  17. * @version v1.1.5 + 2020.07.15
  18. * @deprecated 暂不启用
  19. * @global 无
  20. * @param Swoole $server 服务实例
  21. * @param string $fd 客户端标识
  22. * @param string $status 错误事件状态码
  23. * @return bool
  24. */
  25. public function run($server, $fd, $status) {
  26. $tips = 'Annotate:SW-X Status:'.$status.' ERROR !';
  27. $type = \x\Config::get('server.sw_service_type');
  28. // 只处理HTTP服务请求的抛出
  29. if ($type == 'http') {
  30. if (isset($this->tips[$status])) $tips = $this->tips[$status];
  31. return \x\Restful::code(\x\Restful::LIFECYCLE())->setMsg($tips)->callback();
  32. }
  33. return true;
  34. }
  35. }

由于上面使用\x\Restful组件,抛出了一个LIFECYCLE状态码,所以对应的Restful配置也要进行修改:

/restful/default/code.php修改成如下代码:

  1. <?php
  2. return [
  3. 'ERROR' => 0, // 默认失败状态码
  4. 'SUCCESS' => 1, // 默认成功状态码
  5. 'ACTION_ERROR' => 40001, // 权限校验失败
  6. 'ONROUTE' => 40004, // 不存在的接口
  7. 'LIFECYCLE' => 20001, // 路由生命周期错误回调状态码[使用自定义MSG]
  8. ];

注意,生命周期文件修改后,热重载无效,需要手动stop后,重新start服务。

完成重启后,我们再访问http://IP地址:端口/api/shop/delete接口,就可以看到框架抛出了下面的状态码:

  1. {
  2. "code": 20001,
  3. "msg": "只允许Post请求",
  4. "data": []
  5. }

如果要测试请求成功,可以使用Postman或Jquery等工具,发送Post-Ajax请求即可。

3、Validate校验表单数据

SW-X种推荐使用\x\Validate验证器组件,对请求进行判断过滤。

具体的使用方法,可以参考官方文档:https://www.sw-x.cn/word/v2.5.x/vali_explain.html

下面我们来创建一个Shop校验器,用于针对商品分组的API请求。

创建验证器文件/box/validate/Shop.php,写入代码如下:

  1. <?php
  2. namespace box\validate;
  3. use x\Validate;
  4. class Shop extends Validate
  5. {
  6. // 定义字段对应的规则
  7. protected $rule = [
  8. 'id' => 'require|int',
  9. 'title' => 'require|min:10|max:20',
  10. 'info.des' => 'min:10|max:20',
  11. ];
  12. // 自定义错误值声明
  13. protected $message = [
  14. 'id.require' => '{id}忘记输入啦',
  15. 'title.min' => '{title}不能小于{0}',
  16. 'title.max' => '{title}不能大于{0}',
  17. 'info.des.min' => '{:preset}不能小于{0}',
  18. 'info.des.min' => '{info.des}不能大于{0}',
  19. ];
  20. // 场景定义
  21. protected $scene = [
  22. // 修改时使用的场景(简写)
  23. 'edit' => ['id','info.des'], // 需要校验的字段
  24. // 删除时使用的场景(简写)
  25. 'delete' => ['id'], // 需要校验的字段
  26. ];
  27. }

下面,我们将/app/http/v1_0_1/controller/shop/delete.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 delete extends Http
  7. {
  8. /**
  9. * 使用注解绑定校验器
  10. * @Validate(class="\box\validate\Shop", scene="delete")
  11. */
  12. public function index() {
  13. // Restful组件抛出接口响应
  14. return Restful::code(Restful::SUCCESS())->data('校验通过啦')->callback();
  15. }
  16. }

同时,由于该注解的错误信息是由/box/lifecycle/validate_error.php生命周期文件进行回调处理,所以我们还需要将该文件改成以下代码:

  1. <?php
  2. namespace box\lifecycle;
  3. class validate_error
  4. {
  5. /**
  6. * 接受回调处理
  7. * @todo 无
  8. * @author 小黄牛
  9. * @version v2.5.6 + 2021-09-15
  10. * @deprecated 暂不启用
  11. * @global 无
  12. * @param string $server_type 服务类型 http/websocket/rpc/mqtt
  13. * @param bool $batch 是否全部过滤
  14. * @param array $errors 错误验证结果集
  15. * @return bool
  16. */
  17. public function run($server_type, $batch, $errors) {
  18. // $batch 是用于执行全部过滤规则,再最后一起返回全部的错误原因
  19. // 默认生命周期只返回第一个错误原因
  20. $error = $errors[0]['intact_field'].' => '.$errors[0]['message'];
  21. // 只处理HTTP服务请求的抛出
  22. if ($server_type == 'http') {
  23. return \x\Restful::code(\x\Restful::VALIDATE())->setMsg($errors[0]['message'])->callback();
  24. }
  25. return true;
  26. }
  27. }

由于上面使用\x\Restful组件,抛出了一个VALIDATE状态码,所以对应的Restful配置也要进行修改:

/restful/default/code.php修改成如下代码:

  1. <?php
  2. return [
  3. 'ERROR' => 0, // 默认失败状态码
  4. 'SUCCESS' => 1, // 默认成功状态码
  5. 'ACTION_ERROR' => 40001, // 权限校验失败
  6. 'ONROUTE' => 40004, // 不存在的接口
  7. 'LIFECYCLE' => 20001, // 路由生命周期错误回调状态码[使用自定义MSG]
  8. 'VALIDATE' => 20002, // 校验器生命周期错误回调状态码[使用自定义MSG]
  9. ];

注意,生命周期文件修改后,热重载无效,需要手动stop后,重新start服务。

完成重启后,我们再访问http://IP地址:端口/api/shop/delete接口,就可以看到框架抛出了下面的状态码:

  1. {
  2. "code": 20002,
  3. "msg": "id忘记输入啦",
  4. "data": []
  5. }

访问http://IP地址:端口/api/shop/delete?id=1,就可以通过delete的校验场景了。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议