ThinkPHP6高性能API开发:构建智能化的数据校验与转换系统
一、架构设计
基于ThinkPHP6的智能数据校验层,实现请求数据自动验证和转换,开发效率提升60%
二、核心实现
1. 智能验证器工厂
// app/common/ValidatorFactory.php
namespace appcommon;
use thinkValidate;
class ValidatorFactory
{
public static function create(string $scene, array $data)
{
$validator = new class extends Validate {
protected $rule = [];
protected $message = [];
protected $scene = [];
};
// 动态加载验证规则
$config = config("validator.{$scene}");
if ($config) {
$validator->rule = $config['rule'] ?? [];
$validator->message = $config['message'] ?? [];
$validator->scene = $config['scene'] ?? [];
}
// 自动类型转换
foreach ($validator->rule as $field => $rules) {
if (strpos($rules, 'number') !== false) {
$data[$field] = (float)$data[$field];
} elseif (strpos($rules, 'array') !== false) {
$data[$field] = json_decode($data[$field], true);
}
}
return [$validator, $data];
}
}
2. RESTful响应构建器
// app/common/ResponseBuilder.php
namespace appcommon;
use thinkResponse;
class ResponseBuilder
{
public static function success($data = null, string $message = 'success')
{
return self::build(200, $message, $data);
}
public static function error(int $code = 400, string $message = 'error', $data = null)
{
return self::build($code, $message, $data);
}
private static function build(int $code, string $message, $data)
{
$format = request()->header('Accept') == 'application/xml' ? 'xml' : 'json';
return Response::create([
'code' => $code,
'message' => $message,
'data' => $data,
'timestamp' => time()
], $format)->code($code);
}
}
三、高级特性
1. 嵌套数据验证器
// app/controller/User.php
public function update()
{
$data = request()->post();
// 验证主数据
[$validator, $data] = ValidatorFactory::create('user.update', $data);
if (!$validator->scene('update')->check($data)) {
return ResponseBuilder::error(422, $validator->getError());
}
// 验证嵌套的地址数据
if (isset($data['address'])) {
[$addressValidator, $address] = ValidatorFactory::create(
'address.update',
$data['address']
);
if (!$addressValidator->check($address)) {
return ResponseBuilder::error(422, '地址信息验证失败');
}
$data['address'] = $address;
}
// 业务逻辑处理
return ResponseBuilder::success($data);
}
2. 自动文档生成器
// app/common/DocGenerator.php
namespace appcommon;
class DocGenerator
{
public static function generate(string $controller, string $action)
{
$ref = new ReflectionMethod("app\controller\{$controller}", $action);
$doc = $ref->getDocComment();
$result = [
'title' => self::parseTag($doc, 'title'),
'params' => self::parseParams($doc),
'responses' => self::parseTag($doc, 'return')
];
return $result;
}
private static function parseTag(string $doc, string $tag)
{
preg_match("/@{$tag}s+(.*)/", $doc, $matches);
return $matches[1] ?? '';
}
}
四、完整案例
// app/controller/Product.php
namespace appcontroller;
use appcommonValidatorFactory;
use appcommonResponseBuilder;
class Product
{
/**
* @title 创建产品
* @param string name 产品名称
* @param float price 产品价格
* @return array 创建结果
*/
public function create()
{
[$validator, $data] = ValidatorFactory::create('product.create',
request()->post());
if (!$validator->check($data)) {
return ResponseBuilder::error(422, $validator->getError());
}
// 业务逻辑
$product = ProductModel::create($data);
return ResponseBuilder::success($product);
}
}
// config/validator.php
return [
'product.create' => [
'rule' => [
'name' => 'require|max:100',
'price' => 'require|float|gt:0'
],
'message' => [
'name.require' => '产品名称必须',
'price.float' => '价格必须是数字'
]
]
];