实体验证 - 零个或至少三个

Entity validation - either zero or at least three

我正在使用 symfony 2.8 版本,但遇到了以下问题。我希望将实体 'Article' 的字段 'seeAlso' 限制为零 (none) 或至少 3 个对象(另一篇文章)。所以我在我的 yaml 验证中有这些:

seeAlso:
 - Count:
   min: 3
   minMessage: 'you have got to pick zero or at least three articles'

它检查是否小于三个好,但它不允许我让该字段为空。我该怎么做?

您应该定义自定义验证。您可以通过两种方式进行

1 创建自定义验证约束

首先你需要创建一个约束class

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class ConstraintZeroOrAtLeastThreeConstraint extends Constraint
{
    public $message = 'Put here a validation error message';

    public function validatedBy()
    {
        return get_class($this).'Validator';
    }
}

在这里你定义了一个带有消息的约束,你告诉 symfony 这是验证器(我们将在下面定义)

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class ZeroOrAtLeastThreeConstraintValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        if (!count($value)) {
            return;
        }

        if (count($value) >= 3) {
            return;
        }

        $this
          ->context
          ->buildValidation('You should choose zero or at least three elements')
          ->addViolation();
    }
}

现在您可以在 属性 上使用您的验证器,方法是使用 @ ConstraintZeroOrAtLeastThreeConstraint 对其进行注释(当然,您必须导入实体文件才能使用)

当然,您甚至可以自定义值 0 和 3,通过使用

将此约束概括为 ZeroOrAtLeastTimesConstraint
public function __construct($options)
{
    if (!isset($options['atLeastTimes'])) {
        throw new MissingOptionException(...);
    }

    $this->atLeastTimes = $options['atLeastTimes'];
}

2 在实体内部创建回调验证函数

/**
 * @Assert\Callback
 */
public function validate(ExecutionContextInterface $context, $payload)
{
    if (!count($this->getArticles()) {
       return;
    }

    if (count($this->getArticles() >= 3) { 
       return;
    }

    $context
      ->buildViolation('You should choose 0 or at least 3 articles')
      ->addViolation();
}