我需要创建一个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,
]);
}
}
答案 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()
参数将是一个完整的对象,而不是一个属性。