1
$this->createFormBuilder(null, array(
    'validation_constraint' => new Collection(array(
        'randominput' => array(
            new NotBlank(),
            new Email(),
            new MyCustomConstraint()
        )
))
->add('randominput', 'text');

結果を送信します (必要な属性を html から削除し、firebug を使用):

ここに画像の説明を入力

その制約の中にコードの一部が存在するため、Email() 制約からのメッセージは表示されません。魔女は、NotBlank() 制約のクローン/ハードコードであると思います

if (null === $value || '' === $value) {
    return;
}

Email() 制約は No​​tBlank() の子であるべきだと思います...

NotBlank() で違反が見つかった場合に MyCustomConstraint() を実行しないようにしたい。したがって、たとえば「breakNextConstraintExecutionOnFirstViolation」=> trueなどのオプションがあるとよいでしょう。したがって、1 つのフィールドに 10 個の制約を設定し、3 番目の制約が違反を設定すると、次の 7 つの制約は実行されません。

そのようなロジック/オプションが symfony2 に存在しない場合、MyCustomConstraint クラスから「検証」サービスにアクセスし、既存の制約を再利用できますが、新しい制約ごとにハードコードを記述しないとよいでしょう:

class MyCustomConstraintValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        // use the validator to validate the value, not hardcode
        if (count( $this->get('validator')->validateValue(
            $value,
            new NotBlank()
        )) > 0)
        {
            return;
        }

        $this->context->addViolation('MyCustomConstraint Message...');
    }
}

私の質問は次のとおりです。1つのフィールドに対して複数の違反メッセージを防止し、すべての新しい制約ハードコードで使用しないようにするにはどうすればよいですか?

PS 以前のプロジェクト (symfony ではない) では、エラーメッセージを 1 つだけ表示するフォームを作成しました。そのため、ユーザーはフィールドを 1 つずつ入力し、エラーが 1 つだけ表示されますが、フォームを送信しないため、すべてのフィールドが赤いエラーで埋められます (一部のユーザーを怖がらせます)。しかし、今は少なくともこの問題を解決したいと思っています。

4

0 に答える 0