Поведение по умолчанию - применять все ограничения, определенные для поля.
Однако вы можете определить собственное ограничение проверки, которое прекращает применение ограничений при первом сбое:
def stopOnFirstFail[T](constraints: Constraint[T]*) = Constraint { field: T =>
constraints.toList dropWhile (_(field) == Valid) match {
case Nil => Valid
case constraint :: _ => constraint(field)
}
}
Может использоваться следующим образом:
val loginForm = Form(
"name" -> (text verifying stopOnFirstFail(
nonEmpty,
minLength(4)
))
)
scala> loginForm.bind(Map("name"->"")).errors
res2: Seq[play.api.data.FormError] = List(FormError(name,error.required,WrappedArray()))
scala> loginForm.bind(Map("name"->"foo")).errors
res3: Seq[play.api.data.FormError] = List(FormError(name,error.minLength,WrappedArray(4)))
scala> loginForm.bind(Map("name"->"foobar")).errors
res4: Seq[play.api.data.FormError] = List()
(Обратите внимание, что моя реализация stopOnFirstFail
применяет два раза превышающее ограничение, поэтому у этого не должно быть побочных эффектов)