$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() 制約は NotBlank() の子であるべきだと思います...
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 つだけ表示されますが、フォームを送信しないため、すべてのフィールドが赤いエラーで埋められます (一部のユーザーを怖がらせます)。しかし、今は少なくともこの問題を解決したいと思っています。