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; }
}

2番目の質問は、メソッドで実際のオブジェクト(「property1」と「property2」をチェックするため)を取得するにはどうすればよいvalidate()ですか?

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()メソッドを実装する必要がありますか?何のために使用されますか?

必ずしもそうする必要はありませんが、アノテーションに単一の「先行」プロパティがある場合は、そうすることを強くお勧めします。注釈のプロパティは、キーと値のペアのリストとして定義されます。例:

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

を使用getDefaultOption()すると、どのオプションがデフォルトのオプションであるかを注釈プロセッサに伝えることができます。のデフォルトオプションとして、およびparamAのデフォルトオプションとして定義すると、次のように記述できます。@MyAnnotationvalue@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 に答える