Symfony验证:介于两个数字或一个值之间的范围

Symfony验证:介于两个数字或一个值之间的范围,symfony,validation,Symfony,Validation,我想验证一个介于10和20之间、30和40之间或等于99的数字 我可以想象代码与此类似,但它不起作用: 在Entity\NameOfFile.php中: /* * @Assert\Range( * min=10, * max=20 * ) * * @Assert\Range( * min=30, * max=40 * ) * * @Assert\IdenticalTo(value = 99) */ private $myVariable; 或者类似的事情:

我想验证一个介于10和20之间、30和40之间或等于99的数字

我可以想象代码与此类似,但它不起作用:

在Entity\NameOfFile.php中:

/*
 * @Assert\Range(
 *   min=10,
 *   max=20
 * )
 *
 * @Assert\Range(
 *  min=30,
 *  max=40
 * )
 *
 * @Assert\IdenticalTo(value = 99)
 */
 private $myVariable;
或者类似的事情:

 /*
  * @Assert\Choice({
  *  Range({min = 10, max = 20}),
  *  Range({min = 10, max = 20}), 
  *  99
  * )}
  */
  private $myVariable;
我还添加了最小和最大消息

在第一个选项中,显然只考虑第一个断言,而忽略第二个断言。第二个选项根本不起作用

请给我一个没有正则表达式的解决方案

编辑: 根据M Khalid Juanid的建议,代码如下所示:

/**
 * @Assert\Expression(
 *     "this.getmyVariable() in 10..20 or this.getmyVariable() in 30..40 or this.getmyVariable() == 99",
 *     message="Your error message", groups{"groupA"}
 * )
*private $myVariable;
 */

  ***
if($appendForm->isValid(array($groupA))
{
***  
}
它工作正常,但仅当验证未分配给groupA时。在这种情况下,如何将验证分配给组?

您可以将其用于多个标准

/**
 * @Assert\Expression(
 *     "this.checkRange()",
 *     message="Your error message"
 * )
 */
class YourEntityName
{
    public function checkRange(){
        if(
            ($this->yourPorperty >= 10 && $this->yourPorperty <= 20)
            || ($this->yourPorperty >= 30 && $this->yourPorperty <= 40)
            || ($this->yourPorperty == 90)
        ){
            return true;
        }

        return false;
    }
}

可以使用自定义验证约束。要创建一个,您可以参考官方文档:


您必须将所有约束放在Validator类的
validate
函数中。

自Symfony 5.1以来,有一个新的验证器可以检查是否满足多个约束中的至少一个。


您需要
this.getYourPorperty()
在这里而不是
this.yourPorperty
谢谢您的回答!它很好用。但是如何将此验证分配给组?我把新代码放到帖子上。@BabyWebnaster在
FooFormType.php
/**
 * @Assert\Expression(
 *     "this.getYourPorperty() in 10..20 or this.getYourPorperty() in 30..40 or this.getYourPorperty() == 90",
 *     message="Your error message"
 * )
 */
 /**
 * @Assert\AtLeastOneOf({
 *      @Assert\Range(
 *          min=10,
 *          max=20
 *      ),
 *      @Assert\Range(
 *          min=30,
 *          max=40
 *      ),
 *      @Assert\IdenticalTo(value = 99)
 * })
 */
private $myVariable;