我想使用有关当前用户的数据验证Play 2 Scala密码更新表单。想象一下,再次收集当前密码,新密码和新密码的表单。在验证此表单时,应该确定“当前密码”的值是否与当前用户的实际密码匹配。在验证中,我需要访问当前用户 - 这需要访问当前请求。当我定义表单时,显然请求不在范围内:
val updatePasswordForm = Form(mapping(
"currPassword" -> password,
"newPassword" -> password,
"newPasswordAgain" -> password)(PasswordUpdate.apply)(PasswordUpdate.unapply)
verifying ("passwordsMustMatch", update => update.newPassword == update.newPasswordAgain)
verifying ("incorrectCurrentPassword", pws => authenticate(GAH NEED CURRENT USERS EMAIL, update.currPassword)))
我完全理解在表单验证中使用Request访问会为Forms带来不必要的依赖。如果人们有一个聪明的方法,我只是很好奇。到目前为止我唯一的方法就是这样:
def updatePassword = Action { implicit req =>
validateCurrentPasswordMatches(updatePasswordForm).bindFromRequest.fold(
....
我喜欢在共享的Form声明中将这个依赖于Request的验证打包的方法。
答案 0 :(得分:4)
您可以使用带有隐式定义Request
参数的函数获取更新密码表单,如下所示:
def updatePasswordForm(implicit request: Request[_]) = Form(
// define form here
).verifying(...)
请求参数从bindFromRequest
函数隐式传递。
authenticate
函数现在可以访问(再次隐式定义的)请求参数。您需要将其重新定义为
def authenticate( /* old parameters */ )(implicit request: Request[_]): Boolean = {
// implementation with access to the Request
}