当前位置: 首页 > 后端技术 > PHP

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

时间:2023-03-29 18:21:14 PHP

前言官网地址:SW-X框架-PHP-SwooleX框架专注高性能便捷开发之星:https:///github.com/swoolex/swoolex架构图版本更新规则每个新版本迭代都以v1.0.1的大、中、小版本命名,应用代码存放在/app/http/版本号目录下。改成_。新版本需要复制上一版本的可用代码,修改,保留原有代码。版本发布每个新版本开发完成后,需要在/box/route.php文件中修改镜像路由地址,使其在对外接口地址生效,如下:use\x\Route;//开启版本映射到前端Route::mirror(['/v1_0_1/controller/'=>'/api/',]);控制器名controller存放在/app/http/versionnumber/controller/目录下,定义了一个接口和一个文件方法。比如需要写一个Shop模块的创建接口,创建文件如下:文件地址:/app/http/版本号/controller/shop/create.php,代码如下:namespace应用\http\v1_0_1\控制器\商店;usex\controller\Http;classcreateextendsHttp{/***默认情况下路由中会忽略index方法*/publicfunctionindex(){return$this->fetch('presentationcontroller');}}failed镜像路由映射前的访问地址为:/v1_0_1/controller/shop/create镜像路由映射后的访问地址为:/api/shop/create请求类型限制GET|POST|AJAX请求类型限制,使用@统一Get、@Post、@Ajax声明。比如限制只允许POST-AJAX问题的接口:namespaceapp\http\v1_0_1\controller\shop;usex\controller\Http;classcreateextendsHttp{/***index方法会忽略*@Post*默认情况下在路由中@Ajax*/publicfunctionindex(){return$this->fetch('DemoController');}}ParameterDefaultValuePreset在controller中,禁止使用如下习惯声明参数默认值:namespaceapp\http\v1_0_1\controller\shop;usex\controller\Http;classcreateextendsHttp{/***路由中默认会忽略index方法*/publicfunctionindex(){$param=\x\Request::get();//场景1if(!isset($param['status']))$param['status']=1;//场景2$param['status']=(isset($param['status'])==false)?1:$参数[‘状态’];//场景3$param['status']=$param['status']??1;}}对于isset()判断参数是否未传递后设置默认值的场景,需要使用@Param注解提前声明,例如:namespaceapp\http\v1_0_1\controller\shop;usex\controller\Http;classcreateextendsHttp{/***路由中默认会忽略index方法*@Param(name="status",value="1")*/publicfunctionindex(){$param=\x\Request::get();//如果不提??交,可以直接获取默认值var_dump($param['status']);}}警告:@Param注解参数预设只对isset()场景有效。Empty()、is_null()等都是空场景。表单验证禁止在控制器中编写任何表单格式验证代码。表单验证需要统一在/box/validate/目录下创建验证器。validator的具体使用请参考SW-X官网文档:Validator。例如创建一个驱动相关的验证器,文件:/boxx/validate/Driver.php,代码如下,包括3种验证场景:namespacebox\validate;usex\Validate;classDriverextendsValidate{//定义该字段对应的规则protected$rule=['id'=>'require|int','driver_sn'=>'require|between:1,120','phone'=>'require|phone'];//自定义错误值声明protected$message=['id.require'=>'{:preset}未提交','id.int'=>'{:preset}不是整数格式','driver_sn.require'=>'{:preset}未提交','driver_sn.between'=>'{:preset}长度只能在{0}-{1}位之间','phone.require'=>'{:preset}未提交','phone.phone'=>'{:preset}格式错误',];//可以设置消息的字段别名,它将替换{字段名}占位符并拼在一起protected$alias=['id'=>'driverID','driver_sn'=>'drivernumber','phone'=>'司机电话号码',];//场景定义protected$scene=[//edit'edit'=>['id','driver_sn','phone'],//需要检查的字段//新增'create'=>['driver_sn','phone'],//查询表单'select'=>['field'=>['driver_sn','phone'],//需要验证的字段'delete_rule'=>[//删除验证规则'driver_sn'=>'require','phone'=>'require',],],];}创建完成后,使用@Validate注解执行controllerScenebinding:namespaceapp\http\v1_0_1\controller\shop;usex\controller\Http;classcreateextendsHttp{/***路由中默认会忽略index方法*@Validate(class="\box\validate\Driver",scene="create")*/publicfunctionindex(){return$this->fetch('DemoController');}}权限验证API统一绑定全局中间件/box/middleware/Auth.php,如果需要跳过Api进行权限验证,需要修改中间件内部的$_skip成员属性。Api-Restful管理API由Restful模块统一管理。返回值说明保存在/restful/default/目录下。比如现在我们需要添加一个DRIVER_ERROR状态码,对应的CODE为30001,MSG为驱动不存在。同时,在这个状态码下,还有一个MSG提示驱动余额不足。那么应该是这样定义的,修改/restful/default/code.php文件为如下代码:,//默认值'balance_not'=>'驱动程序余额不足',]];这个可以在controller中使用:namespaceapp\http\v1_0_1\controller\shop;usex\controller\Http;usex\Restful;classcreateextendsHttp{/***index方法会在路由中被忽略default*/publicfunctionindex(){//默认会使用默认的MSGreturnRestful::code(Restful::DRIVER_ERROR())->callback();//也可以指定抛出的MSGreturnRestful::code(Restful::DRIVER_ERROR())->msg('balance_not')->callback();//如果要抛出数据集returnRestful::code(Restful::DRIVER_ERROR())->data('Dataset')->callback();}}更多Restful的使用方法请参考SW-X官网文档:RestfulSupport。对于Restful的返回值,强类型转换系统会自动将返回值中string类型(string)的int和float数据转换回real类型。空字符串,转换回null。注意,如果是string*.00会强制转换成int类型*即0.00会转换成0,18.00会转换成18,这是PHP数据结构的固有问题。例如:{"code":0,"msg":"请求成功","data":{"user_id":"100","money":"19.01","list":[{"id":"1","money":"0.00"},{"id":"2","money":"18.00"}],"region_id":""}}会被转换为:{"code":0,"msg":"请求成功","data":{"user_id":100,"money":19.01,"list":[{"id":1,"money":0},{"id":2,"money":18}],"region_id":null}}在数据模型控制器中,禁止直接使用Db基类操作,任何与数据库相关的操作都应该统一创建对应的Model类用于逻辑采集和处理。Model的存放目录为:/app/http/版本号/model/目录。例如,要添加一个驱动程序表,应该创建一个DriverModel.php文件:namespaceapp\http\v1_0_1\model;usex\Model;classDriverModelextendsModel{//添加驱动程序publicfunctionadd($data){return$this->插入($数据);}//编辑驱动publicfunctionedit($data){return$this->where('id',$data['id'])->update($data);}}下一章,让我们重新开始,一步步搭建整个API项目架构。