自定义Symfony 2类约束验证器NotEqualTo

时间:2012-09-20 07:40:39

标签: validation symfony symfony-forms

我需要创建一个Symfony 2 custom class constraint validator来验证属性是否与另一个属性不相等(即密码不能与用户名匹配)。

我的第一个问题是:我是否需要实施方法getDefaultOption()以及用于什么?

/**
 * @Annotation
 */
class NotEqualTo extends Constraint
{
    /**
     * @var string
     */
    public $message = "{{ property1 }} should not be equal to {{ property2 }}.";

    /**
     * @var string
     */
    public $property1;

    /**
     * @var string
     */
    public $property2;

    /**
     * {@inheritDoc}
     */
    public function getRequiredOptions() { return ['property1', 'property2']; }

    /**
     * {@inheritDoc}
     */
    public function getTargets() { return self::CLASS_CONSTRAINT; }
}

第二个问题是,如何在我的validate()方法中获取实际对象(检查“property1”和“property2”)?

public function validate($value, Constraint $constraint)
{
    if(null === $value || '' === $value) {
        return;
    }

    if (!is_string($constraint->property1)) {
        throw new UnexpectedTypeException($constraint->property1, 'string');
    }

    if (!is_string($constraint->property2)) {
        throw new UnexpectedTypeException($constraint->property2, 'string');
    }

    // Get the actual value of property1 and property2 in the object

    // Check for equality
    if($object->property1 === $object->property2) {
        $this->context->addViolation($constraint->message, [
            '{{ property1 }}' => $constraint->property1,
            '{{ property2 }}' => $constraint->property2,
        ]);
    }
}

1 个答案:

答案 0 :(得分:3)

  

我是否需要实现方法getDefaultOption()以及用于什么?

您不必这样做,但如果您的注释具有单个“前导”属性,则强烈建议您这样做。注释的属性被定义为键值对的列表,例如:

@MyAnnotation(paramA = "valA", paramB = "valB", paramC = 123)
@MaxValue(value = 199.99)

使用getDefaultOption(),您可以告诉注释处理器哪个选项是默认选项。如果您将paramA定义为@MyAnnotation的默认选项,并将value定义为@MaxValue的默认选项,则可以编写:

@MyAnnotation("valA", paramB = "valB", paramC = 123)
@MaxValue(199.99)
@MaxValue(199.99, message = "The value has to be lower than 199.99")
  

如何在validate()方法中获取实际对象(以检查“property1”和“property2”)?

您必须创建类级别约束注释。然后,$value方法中的validate()参数将是一个完整的对象,而不是一个属性。