2

現在のユーザーに関するデータを使用して、Play2Scalaパスワード更新フォームを検証したいと思います。現在のパスワード、新しいパスワード、および新しいパスワードを再度収集するフォームを想像してみてください。このフォームの検証では、「現在のパスワード」の値が実際に現在のユーザーの実際のパスワードと一致するかどうかを確認する必要があります。検証では、現在のユーザーにアクセスする必要があります。これには、現在のリクエストへのアクセスが必要です。フォームを定義するとき、明らかにリクエストは範囲内にありません。

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)))

フォームの検証でリクエストアクセスを使用すると、フォームに不要な依存関係が生じることを完全に理解しています。人々がこれを巧妙に回避する方法があるかどうか私はただ興味があります。これまでの私の唯一のアプローチは次のようなものです。

def updatePassword = Action { implicit req =>
  validateCurrentPasswordMatches(updatePasswordForm).bindFromRequest.fold(
  ....

このリクエストに依存する検証を共有フォーム宣言内にパッケージ化する方法が欲しいです。

4

1 に答える 1

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
}
于 2013-02-13T12:12:53.110 に答える