Php 如何在restful api中验证post中的数据

Php 如何在restful api中验证post中的数据,php,symfony,model-view-controller,code-structure,symfony-validator,Php,Symfony,Model View Controller,Code Structure,Symfony Validator,在插入数据库之前,我需要验证一些数据,为此,我创建了一个从实体返回无效字段的小服务。它在验证单个实体时正常工作 class EntityValidator { protected $validator; public function __construct(ValidatorInterface $validator) { $this->validator = $validator; } public function valid

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

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端点,它接收一个json,其中包含用户id和帖子正文中的百分比,它将验证该实体,以查看它是否与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);    
}
将这种业务逻辑放在控制器中似乎是错误的,但我不知道它放在哪里,我应该为此创建一个服务吗?那么每个具有更复杂验证的端点都将创建一个新的服务

创建JSON请求负载的模型表示。具有公共属性而没有其他属性的模型。e、 假设这个模型叫做销售。 创建一个与销售模型关联的自定义模型。在此验证类中,您将迭代Sale.percentage属性并运行验证逻辑。 在控制器中,调用序列化程序组件和验证程序组件来验证请求。 以上各点的完整示例:

下面的两个链接都有模型示例,但如果您想要更多示例,请在此页面中使用ctrl+f json . 复制并不要触摸控制器。执行UserController::create为您自己的控制器所做的操作。他在同一个控制器中使用$this->数据进行演示,但您应该将其传递给服务并在那里进行处理。 创建JSON请求负载的模型表示。具有公共属性而没有其他属性的模型。e、 假设这个模型叫做销售。 创建一个与销售模型关联的自定义模型。在此验证类中,您将迭代Sale.percentage属性并运行验证逻辑。 在控制器中,调用序列化程序组件和验证程序组件来验证请求。 以上各点的完整示例:

下面的两个链接都有模型示例,但如果您想要更多示例,请在此页面中使用ctrl+f json . 复制并不要触摸控制器。执行UserController::create为您自己的控制器所做的操作。他在同一个控制器中使用$this->数据进行演示,但您应该将其传递给服务并在那里进行处理。
谢谢,这正是我需要的。喜欢这个网站,有很多有用的信息。谢谢,这正是我需要的。喜欢这个网站,有很多有用的信息。