前言
官网地址:SW-X框架-专注高性能便捷开发而生的PHP-SwooleX框架
希望各大佬举起小手,给小弟一个star:https://github.com/swoolex/swoolexlex
1、404接口配置
HTTP服务中,当查找不到对应的路由时,会加载/config/route.php
配置文件中的404配置。
以下为具体的参数配置项:
<?php return [ // 找不到路由的时候,是否启用自定义的错误处理程序 '404' => true, // 自定义的错误处理程序,只需要提供一个类的命名空间位置即可 'error_class' => '\\box\\http_error', ];
下面我们打开/box/http_error.php
文件,并修改成以下代码:
<?php namespace box; use \x\controller\Http; class http_error extends Http{ /** * 入口 * @todo 无 * @author 小黄牛 * @version v1.0.1 + 2020.05.29 * @deprecated 暂不启用 * @global 无 * @return void */ public function __construct() { return \x\Restful::code(\x\Restful::ONROUTE())->callback(); } }
由于上面使用\x\Restful
组件,抛出了一个ONROUTE
状态码,所以对应的Restful配置也要进行修改:
/restful/default/code.php
修改成如下代码:
<?php return [ 'ERROR' => 0, // 默认失败状态码 'SUCCESS' => 1, // 默认成功状态码 'ACTION_ERROR' => 40001, // 权限校验失败 'ONROUTE' => 40004, // 不存在的接口 ];
/restful/default/msg.php
修改成如下代码:
<?php return [ // 默认错误状态码对应的tips 'ERROR' => [ 'default' => '请求失败', // 默认值 ], // 默认成功状态码对应的tips 'SUCCESS' => [ 'default' => '请求成功', // 默认值 'test' => '测试msg', ], // 权限校验失败 'ACTION_ERROR' => [ 'default' => '权限校验失败', // 默认值 ], // 不存在的接口 'ONROUTE' => [ 'default' => '该接口不存在', // 默认值 ], ];
这时候我们随便访问一个不存在的接口,http://IP地址:端口/api/user/info
,就可以看到框架抛出了下面的状态码:
{ "code": 40004, "msg": "该接口不存在", "data": [] }
2、请求类型限制
SW-X中需要限制某个HTTP控制器的请求类型有多种方式,
第2种,则是使用\x\Validate
验证器组件,对请求头进行判断过滤。
一般建议使用第1种方式,因为非常灵活,而第2种一般是用于对某些同组接口需要进行相同请求头过滤,例如签名判断等业务时使用。
下面,我们将/app/http/v1_0_1/controller/shop/delete.php
控制器改代码如下:
<?php namespace app\http\v1_0_1\controller\shop; use x\controller\Http; // 引入Restful组件 use x\Restful; class delete extends Http { /** * 我只允许Post+Ajax的请求 * @Post * @Ajax */ public function index() { // Restful组件抛出接口响应 return Restful::code(Restful::SUCCESS())->data('您的请求通过啦')->callback(); } }
同时,由于该注解的错误信息是由/box/lifecycle/route_error.php
生命周期文件进行回调处理,所以我们还需要将该文件改成以下代码:
<?php namespace box\lifecycle; class route_error { /** * 特殊转换3种注解的Msg值 */ private $tips = [ 'Route Method Get' => '只允许Get请求', 'Route Method Post' => '只允许Post请求', 'Route Method Ajax' => '只允许Ajax请求', ]; /** * 接受回调处理 * @todo 无 * @author 小黄牛 * @version v1.1.5 + 2020.07.15 * @deprecated 暂不启用 * @global 无 * @param Swoole $server 服务实例 * @param string $fd 客户端标识 * @param string $status 错误事件状态码 * @return bool */ public function run($server, $fd, $status) { $tips = 'Annotate:SW-X Status:'.$status.' ERROR !'; $type = \x\Config::get('server.sw_service_type'); // 只处理HTTP服务请求的抛出 if ($type == 'http') { if (isset($this->tips[$status])) $tips = $this->tips[$status]; return \x\Restful::code(\x\Restful::LIFECYCLE())->setMsg($tips)->callback(); } return true; } }
由于上面使用\x\Restful
组件,抛出了一个LIFECYCLE
状态码,所以对应的Restful配置也要进行修改:
/restful/default/code.php
修改成如下代码:
<?php return [ 'ERROR' => 0, // 默认失败状态码 'SUCCESS' => 1, // 默认成功状态码 'ACTION_ERROR' => 40001, // 权限校验失败 'ONROUTE' => 40004, // 不存在的接口 'LIFECYCLE' => 20001, // 路由生命周期错误回调状态码[使用自定义MSG] ];
注意,生命周期文件修改后,热重载无效,需要手动stop后,重新start服务。
完成重启后,我们再访问http://IP地址:端口/api/shop/delete
接口,就可以看到框架抛出了下面的状态码:
{ "code": 20001, "msg": "只允许Post请求", "data": [] }
如果要测试请求成功,可以使用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
,写入代码如下:
<?php namespace box\validate; use x\Validate; class Shop extends Validate { // 定义字段对应的规则 protected $rule = [ 'id' => 'require|int', 'title' => 'require|min:10|max:20', 'info.des' => 'min:10|max:20', ]; // 自定义错误值声明 protected $message = [ 'id.require' => '{id}忘记输入啦', 'title.min' => '{title}不能小于{0}', 'title.max' => '{title}不能大于{0}', 'info.des.min' => '{:preset}不能小于{0}', 'info.des.min' => '{info.des}不能大于{0}', ]; // 场景定义 protected $scene = [ // 修改时使用的场景(简写) 'edit' => ['id','info.des'], // 需要校验的字段 // 删除时使用的场景(简写) 'delete' => ['id'], // 需要校验的字段 ]; }
下面,我们将/app/http/v1_0_1/controller/shop/delete.php
控制器改代码如下:
<?php namespace app\http\v1_0_1\controller\shop; use x\controller\Http; // 引入Restful组件 use x\Restful; class delete extends Http { /** * 使用注解绑定校验器 * @Validate(class="\box\validate\Shop", scene="delete") */ public function index() { // Restful组件抛出接口响应 return Restful::code(Restful::SUCCESS())->data('校验通过啦')->callback(); } }
同时,由于该注解的错误信息是由/box/lifecycle/validate_error.php
生命周期文件进行回调处理,所以我们还需要将该文件改成以下代码:
<?php namespace box\lifecycle; class validate_error { /** * 接受回调处理 * @todo 无 * @author 小黄牛 * @version v2.5.6 + 2021-09-15 * @deprecated 暂不启用 * @global 无 * @param string $server_type 服务类型 http/websocket/rpc/mqtt * @param bool $batch 是否全部过滤 * @param array $errors 错误验证结果集 * @return bool */ public function run($server_type, $batch, $errors) { // $batch 是用于执行全部过滤规则,再最后一起返回全部的错误原因 // 默认生命周期只返回第一个错误原因 $error = $errors[0]['intact_field'].' => '.$errors[0]['message']; // 只处理HTTP服务请求的抛出 if ($server_type == 'http') { return \x\Restful::code(\x\Restful::VALIDATE())->setMsg($errors[0]['message'])->callback(); } return true; } }
由于上面使用\x\Restful
组件,抛出了一个VALIDATE
状态码,所以对应的Restful配置也要进行修改:
/restful/default/code.php
修改成如下代码:
<?php return [ 'ERROR' => 0, // 默认失败状态码 'SUCCESS' => 1, // 默认成功状态码 'ACTION_ERROR' => 40001, // 权限校验失败 'ONROUTE' => 40004, // 不存在的接口 'LIFECYCLE' => 20001, // 路由生命周期错误回调状态码[使用自定义MSG] 'VALIDATE' => 20002, // 校验器生命周期错误回调状态码[使用自定义MSG] ];
注意,生命周期文件修改后,热重载无效,需要手动stop后,重新start服务。
完成重启后,我们再访问http://IP地址:端口/api/shop/delete
接口,就可以看到框架抛出了下面的状态码:
{ "code": 20002, "msg": "id忘记输入啦", "data": [] }
访问http://IP地址:端口/api/shop/delete?id=1
,就可以通过delete
的校验场景了。