在表单约束中访问当前请求

时间:2012-10-02 16:37:50

标签: playframework-2.0

我想使用有关当前用户的数据验证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的验证打包的方法。

1 个答案:

答案 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
}