1

我需要创建一个Symfony 2 自定义类约束验证器,以验证一个属性不等于另一个(即密码不能匹配用户名)。

我的第一个问题是:我需要实现方法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,
        ]);
    }
}
4

1 回答 1

3

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

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

@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()方法中的参数将是一个完整的对象,而不是一个单一的属性。

于 2012-09-20T08:37:17.610 回答