首页 > 解决方案 > 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),因为我需要一种方法来对约束进行分组BC在我的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。但如果有办法,我真的很想知道!

标签: phpsymfonyvalidationsymfony-validator

解决方案


推荐阅读