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

前言

官网地址: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的校验场景了。

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