Symfony 5中属性未通过URL约束时如何终止类验证器执行
问题1:判断URL未通过约束的实现语法
有两种可直接使用的实现方式:
方式1:手动校验URL值
你可以直接复用Symfony原生的Url约束在类验证器内做校验:
use Symfony\Component\Validator\Constraints\Url; // 在AccountToMarketerValidator的validate方法内 $urlConstraint = new Url(['protocols' => ['https']]); $urlErrors = $this->context->getValidator()->validate($value->getUrl(), $urlConstraint); if (count($urlErrors) > 0) { return; }
方式2:直接读取验证上下文的已有错误
Symfony默认会优先执行属性级约束,再执行类级约束,你可以直接判断上下文中是否存在url字段的错误:
// 在AccountToMarketerValidator的validate方法内 if ($this->context->hasViolationForPropertyPath('url')) { return; }
问题2:无需手动写判断的优雅通用方案
你可以使用Symfony自带的组序列(GroupSequence) 功能,直接定义全局校验顺序,实现「所有属性校验全部通过后才执行类级校验」的需求,不管后续扩展多少字段都不需要额外加判断。
实现步骤:
- 在Account类上配置组序列,将类验证器归到单独的校验组,指定属性校验完成后再执行类校验:
use Symfony\Component\Validator\Constraints as Assert; /** * @Assert\GroupSequence({"Account", "ClassValidation"}) * @AppAssert\AccountToMarketer(groups={"ClassValidation"}) */ class Account { /** * @Assert\NotBlank * @Assert\Url( * protocols = {"https"} * ) */ private $url; // 其他扩展字段不需要额外配置 }
- 正常触发校验即可:执行时会先跑所有属性级的默认约束,只要存在任意属性错误就会直接终止校验流程,不会执行后续的类验证器逻辑。
内容的提问来源于stack exchange,提问作者Karim Mtl
相关产品推荐
相关产品推荐

