Symfony Validator如何在AtLeastOneOf中实现A或(B且C)的约束组合
Symfony Validator 实现 A || (B && C) 约束组合方案
核心实现逻辑
- 用内置
All约束实现B && C的与逻辑分组:All约束要求其内部包含的所有约束全部校验通过才算该组校验通过 - 再将
All约束实例和A约束一起传入AtLeastOneOf约束,即可实现A || (B && C)的逻辑,全程使用官方内置约束,无需自定义、回调或表达式写法
完整可运行代码示例
<?php use Symfony\Component\Validator\Constraints\Length; use Symfony\Component\Validator\Constraints\EqualTo; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\AtLeastOneOf; use Symfony\Component\Validator\Constraints\All; use Symfony\Component\Validator\Validation; $var = 'Something'; // 原生PHP的实现逻辑 if ($var == '' || ($var != '' && mb_strlen($var) < 10)) { echo '$var must be empty string or less than 10 chars'; } // 用Validator组件的实现方式 $validator = Validation::createValidator(); $violations = $validator->validate($var, [ new AtLeastOneOf([ // 对应条件A:等于空字符串 new EqualTo(['value' => '']), // 对应 (B && C) 分组:非空 + 长度小于10 new All([ new NotBlank(), new Length(['max' => 9]) ]) ], [ 'message' => '$var must be empty string or less than 10 chars' ]) ]); if (count($violations)) { echo 'First error : ' . $violations[0]->getMessage(); }
该写法兼容Symfony Validator 5.3及以上版本,完全符合纯PHP实例化约束的使用要求,无额外配置依赖。
内容的提问来源于stack exchange,提问作者Ajani
相关产品推荐
相关产品推荐

