我正在使用symfony 2.8版本,我遇到了以下问题。我希望实体'Article'的字段'seeAlso'被限制为零(无)或至少3个对象(另一篇文章)。所以我在我的yaml验证中有这些:
seeAlso:
- Count:
min: 3
minMessage: 'you have got to pick zero or at least three articles'
它检查它是否小于三,但它不允许我让该字段为空。我如何使这项工作?
答案 0 :(得分:4)
您应该定义自定义验证。您可以通过两种方式继续
首先,您需要创建一个约束类
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'];
}
/**
* @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();
}