Playframeworkでフォームを扱うときに、個人的に良く使うバリデーションのまとめ。
ただ制約など書き方が複数あるものは、良く使う1パターンのみ書きます。
複雑なフォームを定義しない限り、ここにあるもので大体カバーできると思う。
種類
文字とか数値とか
case class MyForm(name:String, age:Int)
val myForm = Form(
mapping(
// 文字列
"name" -> text,
// 数値
"age" -> number
)(MyForm.apply)(MyForm.unapply)
)
制約
長さとかパターンとか
case class MyForm(naem:String, handleName:String, age:Int, email:String)
val emailPattern = Constraints.pattern("[\\w\\d_-]+@[\\w\\d_-]+\\.[\\w\\d._-]+".r)
val myForm = Form(
mapping(
// 必須
"name" -> nonEmptyText,
// 文字数 (3文字以上、7文字以下)
"handleName" -> text(minLength = 3, maxLength = 7),
// 最大最小 (最小:0、最大:100)
"age" -> number(min = 0, max = 100),
// 正規表現 (メールアドレス)
"email" -> text.verifying(emailPattern)
)(MyForm.apply)(MyForm.unapply)
)
入力値の一致確認
パスワードとパスワード(確認)とか
case class MyForm(password:String)
val myForm = Form(
mapping(
// password1とpassword2が一致すること
"password" ->
tuple(
"password1" -> nonEmptyText,
"password2" -> nonEmptyText
).verifying(passwords => passwords._1 == passwords._2)
)(MyForm.apply)(MyForm.unapply)
)
複数のバリデーション
制約を複数つける
case class MyForm(password:String)
val halfWidthAlphaNum = Constraints.pattern("[a-zA-Z0-9]+".r)
val myForm = Form(
mapping(
// password1とpassowrd2が一致、かつ、半角英数字
"password" ->
tuple(
"password1" -> nonEmptyText,
"password2" -> nonEmptyText
).verifying(passwords => passwords._1 == passwords._2).verifying(halfWidthAlphaNum)
)(MyForm.apply)(MyForm.unapply)
)
デフォルト値
入力あればその値、無かったらデフォルト値
case class MyForm(year:Int, month:Int)
val myForm = Form(
mapping(
// デフォルト値: 2015
"year" -> default(number, 2015)
// 最小:1、最大:12、デフォルト値: 1
"month" -> default(number(min = 1, max = 12), 1)
)(MyForm.apply)(MyForm.unapply)
)
省略
あったら使うし、無かったら使わない
case class MyForm(comment:Option[String])
val myForm = Form(
mapping(
// 省略可、文字数140文字以下
"comment" -> Option(text(maxLength = 140))
)(MyForm.apply)(MyForm.unapply)
)