Symfony 5.4下一对多关联中验证Intervention的idate字段唯一性
解决方案:自定义约束验证多个Intervention的idate唯一性
由于Symfony 5.4不支持@Assert\Unique的fields选项,我们可以通过自定义验证约束实现需求,具体步骤如下:
1. 创建自定义约束类
在项目中创建src/Validator/Constraints/UniqueInterventionDate.php:
<?php namespace App\Validator\Constraints; use Symfony\Component\Validator\Constraint; /** * @Annotation */ class UniqueInterventionDate extends Constraint { public $message = "多个干预记录的日期不能重复,请确保每个干预的日期唯一。"; public function getTargets() { return self::PROPERTY_CONSTRAINT; } public function validatedBy() { return static::class.'Validator'; } }
2. 创建对应的验证器类
接着创建src/Validator/Constraints/UniqueInterventionDateValidator.php,实现核心验证逻辑:
<?php namespace App\Validator\Constraints; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidator; class UniqueInterventionDateValidator extends ConstraintValidator { public function validate($value, Constraint $constraint) { if (!is_iterable($value)) { return; } $dates = []; foreach ($value as $intervention) { $date = $intervention->getIdate(); if (null === $date) { continue; } $dateString = $date->format('Y-m-d'); if (in_array($dateString, $dates, true)) { $this->context->buildViolation($constraint->message) ->atPath('[].idate') ->addViolation(); return; } $dates[] = $dateString; } } }
3. 在Request实体中应用自定义约束
修改Request.php的$interventions属性,添加自定义约束注解:
/** * @ORM\OneToMany(targetEntity=Intervention::class, mappedBy="request") * @Assert\Count(min=1, max=3) * @Assert\Valid * @App\Validator\Constraints\UniqueInterventionDate */ private $interventions;
逻辑说明
- 验证器会遍历Request关联的所有Intervention实例,将idate转为字符串后对比去重
- 若发现重复日期,会触发验证错误并指向对应的intervention的idate字段
- 结合已有的
@Assert\Valid约束,会先完成Intervention自身字段的验证,再执行唯一性检查
内容的提问来源于stack exchange,提问作者barbuslex
相关产品推荐
相关产品推荐

