gpt4 book ai didi

php - 如何验证restful api中post的数据

转载 作者:行者123 更新时间:2023-12-02 03:29:58 25 4
gpt4 key购买 nike

我需要在插入数据库之前验证一些数据,为此我创建了一个从实体返回无效字段的小服务。验证单个实体时它工作正常。

class EntityValidator
{
protected $validator;

public function __construct(ValidatorInterface $validator)
{
$this->validator = $validator;
}

public function validate($entity)
{
$errors = $this->validator->validate($entity);
$response = null;
if ($errors->count()) {
foreach ($errors as $error) {
$response[$error->getPropertyPath()] = $error->getMessage();
}
}

return $response;
}
}

但我一直在努力验证更复杂的问题,例如:这是一个restful api端点,它接收带有user_id和帖子正文中百分比的json,它将验证实体以查看它是否与symfony验证器约束映射正确。

public function create(Request $request, EntityValidator $entityValidator)
{
$data = json_decode($request->getContent(), true);
$entityExample = new EntityExample();
$entityExample
->setUserId($data['user_id'])
->setPercentage($data['percentage'])
;
$errors = $entityValidator->validate($entityExample);
// .. do other things ..
return new JsonResponse($errors);
}

但是假设我收到一个数据数组,并且我要一次插入多行,并且有一个业务逻辑说“用户的百分比总和需要为 100”

public function create(Request $request, EntityValidator $entityValidator)
{
$data = json_decode($request->getContent(), true);
$totalPercentage = 0;
foreach ($data as $element) {
$entityExample = new EntityExample();
$entityExample
->setUserId($element['user_id'])
->setPercentage($element['percentage'])
;
$totalPercentage += $element['percentage'];
}
$errors = $entityValidator->validate($entityExample);
if ($totalPecentage != 100) {
$errors[] = 'Sum of percentage must be 100';
}
// .. do other things ..
return new JsonResponse($errors);
}

将这种业务逻辑保留在 Controller 内似乎是错误的,但我不知道把它放在哪里,我应该为此创建一个服务吗?那么每个具有更复杂验证的端点都会创建一个新服务?

最佳答案

  1. 创建 JSON 请求负载的模型表示形式。具有公共(public)属性的模型,仅此而已。例如假设模型名为 Sale
  2. 创建自定义 Validation Constraint它将与 Sale 模型连接。在此验证类中,您将迭代 Sale.percentage 属性并运行验证逻辑。
  3. 在 Controller 中,您调用序列化器组件和验证器组件来验证请求。

上述各点的完整示例:

  1. 下面的两个链接都有模型示例,但如果您想要更多示例,只需在此页面中执行 ctrl+f json http://www.inanzzz.com/index.php/posts/symfony
  2. Class level custom assert validation constraint in symfony
  3. A simple way of handling request, response and exceptions in Symfony API 。复制并不要触摸AbstractController。执行 UserController::create 为您自己的 Controller 所做的操作。他在同一 Controller 中使用 $this->data 进行演示,但您应该将其传递给服务并在那里进行处理。

关于php - 如何验证restful api中post的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52131276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com