Form Handling & Validasi (Play Forms)
Penjelasan
Play Forms menyediakan cara deklaratif untuk memetakan data form HTML ke case class Scala sekaligus memvalidasinya. `Form(mapping(...)(ApplyFunction)(UnapplyFunction))` mendefinisikan struktur form beserta aturan validasi tiap field (misalnya `nonEmptyText`, `number(min = 0)`, `email`). Binding dilakukan lewat `form.bindFromRequest()` di dalam Action, yang otomatis mengambil data dari body request POST. Hasil binding dicek dengan `.fold(formDenganError => ..., dataValid => ...)` — cabang pertama dijalankan kalau ada error validasi (biasanya me-render ulang form dengan pesan error), cabang kedua dijalankan kalau data valid dan siap diproses lebih lanjut (misalnya disimpan ke database).
Contoh Konsep
import play.api.data._
import play.api.data.Forms._
import play.api.mvc._
case class DataProduk(nama: String, harga: Int)
val formProduk: Form[DataProduk] = Form(
mapping(
"nama" -> nonEmptyText,
"harga" -> number(min = 0)
)(DataProduk.apply)(DataProduk.unapply)
)
def simpan(): Action[AnyContent] = Action { implicit request =>
formProduk.bindFromRequest().fold(
formError => BadRequest("Form tidak valid"),
data => Ok(s"Produk ${data.nama} seharga ${data.harga} disimpan")
)
}
Praktikum
Buat Form untuk case class DataPendaftar(nama: String, umur: Int, email: String) dengan validasi umur minimal 17 dan email harus format email valid.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Selalu tampilkan ulang form dengan pesan error yang jelas di cabang gagal fold, jangan cuma BadRequest polos — pengguna butuh tahu field mana yang salah dan kenapa.