前言官网地址:SW-X框架-专一高性能便捷开发而生的PHP-SwooleX框架心愿各大佬举起小手,给小弟一个star:架构图谱版本更新规定每个新版本迭代以v1.0.1的大中小版本起
前言
官网地址:SW-X框架-专一高性能便捷开发而生的PHP-SwooleX框架
心愿各大佬举起小手,给小弟一个star:https://github.com/swoolex/swoolex
架构图谱
版本更新规定
每个新版本迭代以v1.0.1
的大中小版本起名,利用代码存储在/app/http/
版本号目录下,.
改为_
。
新版本须要拷贝上一个版本的可用代码,进行批改,并保留原代码。
版本公布
每个新版本开发实现后,须要在/box/route.php
文件中,批改镜像路由地址,使其失效到对外接口地址中,如下:
use \x\Route;
// 对前端凋谢版本映射
Route::mirror([
'/v1_0_1/controller/' => '/api/',
]);
控制器命名
控制器对立存储在/app/http/版本号/controller/
目录下,以一个接口一个文件的办法进行定义。
例如,须要编写一个Shop
模块的create
接口,那应该创立文件如下:
文件地址:/app/http/版本号/controller/shop/create.php
,代码如下:
namespace app\http\v1_0_1\controller\shop;
use x\controller\Http;
class create extends Http
{
/**
* index办法默认会在路由中疏忽
*/
public function index() {
return $this->fetch('演示控制器');
}
}
未通过镜像路由映射前的拜访地址是:/v1_0_1/controller/shop/create
通过镜像路由映射后的拜访地址是:/api/shop/create
申请类型限度
对于GET|POST|AJAX
申请类型的限度,对立应用@Get
、@Post
、@Ajax
的形式申明。
例如限度只容许POST-AJAX
问题的接口:
namespace app\http\v1_0_1\controller\shop;
use x\controller\Http;
class create extends Http
{
/**
* index办法默认会在路由中疏忽
* @Post
* @Ajax
*/
public function index() {
return $this->fetch('演示控制器');
}
}
参数默认值预设
控制器中,禁止应用以下习惯申明参数默认值:
namespace app\http\v1_0_1\controller\shop;
use x\controller\Http;
class create extends Http
{
/**
* index办法默认会在路由中疏忽
*/
public function index() {
$param = \x\Request::get();
// 场景一
if (!isset($param['status'])) $param['status'] = 1;
// 场景二
$param['status'] = (isset($param['status']) == false) ? 1 : $param['status'];
// 场景三
$param['status'] = $param['status'] ??1;
}
}
对于以上isset()
判断参数是否未传递后,设置默认值的场景,要对立应用@Param
注解提前申明,例如:
namespace app\http\v1_0_1\controller\shop;
use x\controller\Http;
class create extends Http
{
/**
* index办法默认会在路由中疏忽
* @Param(name="status", value="1")
*/
public function index() {
$param = \x\Request::get();
// 如果未提交的状况下,能够间接获取到默认值
var_dump($param['status']);
}
}
正告:@Param
注解参数预设,只对isset()
场景无效,empty()
、is_null()
等为空场景有效。
表单校验
禁止在控制器中编写表单格局校验的任何代码,表单校验须要对立在/box/validate/
目录中创立校验器。
校验器的具体应用办法,能够参考SW-X官网文档:校验器。
例如创立一个司机相干的校验器,文件:/boxx/validate/Driver.php
,代码如下,蕴含了3种校验场景:
namespace box\validate;
use x\Validate;
class Driver extends Validate
{
// 定义字段对应的规定
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}格局谬误',
];
// 能够设置message时的字段别名,会把{字段名}占位符替换后一起抛出
protected $alias = [
'id' => '司机ID',
'driver_sn' => '司机编号',
'phone' => '司机手机号码',
];
// 场景定义
protected $scene = [
// 编辑
'edit' => ['id','driver_sn', 'phone'], // 须要校验的字段
// 新增
'create' => ['driver_sn', 'phone'],
// 查问表单
'select' => [
'field' => ['driver_sn', 'phone'], // 须要校验的字段
'delete_rule' => [ // 删除校验规定
'driver_sn' => 'require',
'phone' => 'require',
],
],
];
}
创立实现后,应用@Validate
注解,在控制器中进行场景绑定:
namespace app\http\v1_0_1\controller\shop;
use x\controller\Http;
class create extends Http
{
/**
* index办法默认会在路由中疏忽
* @Validate(class="\box\validate\Driver", scene="create")
*/
public function index() {
return $this->fetch('演示控制器');
}
}
权限校验
API对立绑定了全局中间件/box/middleware/Auth.php
,如果须要跳过权限校验的Api,须要批改该中间件外部的$_skip
成员属性即可。
Api-Restful治理
API对立应用Restful模块进行治理,目录在/restful/
目录下,状态码与返回值阐明寄存在/restful/default/
目录下。
例如当初要增加一个DRIVER_ERROR
的状态码,对应CODE为30001
,MSG为司机不存在
。
同时,该状态码下,还有一个MSG为司机余额有余
。
那么应该这样定义,批改/restful/default/code.php
文件为如下代码:
return [
// default示意默认应用的msg
'DRIVER_ERROR' => [
'default' => '司机不存在', // 默认值
'balance_not' => '司机余额有余',
]
];
在控制器中就能够这样应用:
namespace app\http\v1_0_1\controller\shop;
use x\controller\Http;
use x\Restful;
class create extends Http
{
/**
* index办法默认会在路由中疏忽
*/
public function index() {
// 会默认应用default的MSG
return Restful::code(Restful::DRIVER_ERROR())->callback();
// 也能够指定抛出的MSG
return Restful::code(Restful::DRIVER_ERROR())->msg('balance_not')->callback();
// 如果要抛出数据集
return Restful::code(Restful::DRIVER_ERROR())->data('数据集')->callback();
}
}
更多对于Restful的应用办法,能够参考SW-X官网文档:Restful反对。
对于Restful返回值强类型转换
零碎会主动把返回值中字符串类型(string
)的int
、float
数据转换回实在类型。
空字符串,转换回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
文件:
namespace app\http\v1_0_1\model;
use x\Model;
class DriverModel extends Model
{
// 增加司机
public function add($data) {
return $this->insert($data);
}
// 编辑司机
public function edit($data) {
return $this->where('id', $data['id'])->update($data);
}
}
下一章节,咱们再来开始,一步步的搭建整个API我的项目架构。