php - Symfony Validator,如何在 AtLeastOneOf 中结合约束来做 A OR (B AND C)
问题描述
就上下文而言,我目前正在开发一个普通的 PHP 项目,没有框架,几乎没有 POO,这一切都不是我的选择,我只是一个胶带人。因此,对于任何涉及代码示例的响应,请考虑将组件用作独立组件,并且仅使用普通 PHP 示例进行说明,没有注释、属性、YAML、XML 或类似的东西。
我已经开始使用 symfony 的 Validator 组件(5.3 版)来清理用户输入。在阅读了验证组件的文档并在各处搜索类似的内容后,我找不到如何通过以下方式组合约束的示例:
考虑 3 个约束,A
, B
, C
。我想将这些约束应用于一个字段,因此它是有效的 if A || (B && C)
。我可以很容易地制作A && B && C
,我知道如何使用约束AtLeastOneOf
来做A || B || C
甚至A && (B || C)
,但我不知道A || (B && C)
,因为我需要一种方法来对约束进行分组B
并C
在我的AtLeastOneOf
约束内。
所以,这是我的问题的一个例子(请注意,这些约束只是例如,重要的部分是A || (B && C)
问题,我知道有一个解决方案不使用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\Validation;
$var = 'Something';
// How i would have done it in plain PHP
if ($var == '' || ($var != '' && mb_strlen($var) < 10)) {
echo '$var must be empty string or less than 10 chars';
}
// How to do it with validator
$validator = Validation::createValidator();
$violations = $validator->validate($var, [
// How to do it whith constraints ?
]);
if (count($violations)) {
echo 'First error : ' . $violations[0]->getMessage();
}
因为这是我第一次使用 symfony 验证(我可能在几年前的 Silex 项目中使用过它,但时间已经过去了),我想肯定有一个我根本不知道的解决方案。
需要明确的是,我已经找到并阅读了 How to create an "OR" Symfony Validator Constraint,我知道我可以使用Custom
约束、Callback
约束或Expression
约束来做到这一点,但这不是我想要的。我正在寻找更直接的东西,我的观点是:如果我可以使用布尔运算符和括号轻松地做到这一点,那么我应该能够通过验证约束轻松地做到这一点!
如果没有办法做到这一点,那很好,我将使用回调或类似的东西,然后继续查看我是否可以创建某种解决方案并希望将其提交给 symfony。但如果有办法,我真的很想知道!
解决方案
推荐阅读
- msbuild - Msbuild:根据文件内容过滤项目组
- c# - 两个属性相同时的LINQ groupby
- menuitem - 在android studio中调整appbar项目
- typescript - 基于其他接口创建对象/接口
- html - 图像和文本之间的空白即使 0 填充也不起作用
- scala - 使用错误的 Scala 版本编译插件
- python - 具有分类数据的一类支持向量机
- javascript - 如何总结总json
- postgresql - JBPM - 'Processinstacelog' 表在 Psotgres DB 中将状态显示为整数而不是文本数据类型
- ios - CollectionView iOS中的多个标签和ImageView