如何使用播放框架案例类绑定确认密码字段?

Posted

技术标签:

【中文标题】如何使用播放框架案例类绑定确认密码字段?【英文标题】:How to have confirm password field using play framework case class bind? 【发布时间】:2016-07-12 15:11:19 【问题描述】:

我有两个模型:

case class User(uid: Option[Int], email: String, password: String, created_at: Timestamp, updated_at: Timestamp)

case class UserProfile(firstname: String, lastname: String, gender: Int, user_id: Int)

我在控制器的表单中绑定它:

val date = new Date()
  val currentTimestamp= new Timestamp(date.getTime());
  val registerForm = Form(
    tuple(
          "user" -> mapping(
            "uid" -> optional(number),
            "email" -> email,
            "password" -> nonEmptyText,
            "created_at" -> ignored(currentTimestamp),
          "updated_at" -> ignored(currentTimestamp)
        )  (User.apply)(User.unapply).verifying("Email already exists.", fields => fields match 
            case user => 
              val result = userDao.findByEmail(user.email)
              !result.isDefined
            
          ),
        "profile" -> mapping(
          "firstname"->nonEmptyText,
          "lastname"->nonEmptyText,
          "gender" -> ignored(0),
          "user_id" -> ignored(0)
        )(UserProfile.apply)(UserProfile.unapply))
    )

我怎样才能在绑定的表单中有一个确认密码字段?我不能在模型案例类中使用它,因为我也将它用于我的 DAO Slick 操作,并且再拥有一个具有类似特征的字段是不值得的。

谢谢

【问题讨论】:

我相信你这里有两个用例:一个是创建用户,一个是在你的应用中代表用户。所以我建议你拆分它:为用户创建创建一个特例类,并保留 User 和 UserProfile 以在你的应用中代表你的用户 @LouisF。是的,我也想过,但是会不会违反 DRY 原则? 我认为您没有两次表示相同的信息:一方面您想要表示您想要创建用户的事实,另一方面您想要表示用户。我相信这是要走的路,否则会导致笨拙的黑客攻击(您已经可以使用"created_at" -> ignored(currentTimestamp) 观察到这一点)。我认为你应该尝试在你的类型中表达你的意图。 你也会得到更多可测试的代码 【参考方案1】:

我同意上面的 Louis F.,您应该将用户数据的接收与持久性分开。你可以有一个 DTO:

case class UserData(email: String, password: String, passwordCheck: String)

并以与上述相同的方式使用verifying 以确保password == passwordCheck (因此只有匹配时才会绑定表单)。然后我会添加到User 伴随对象:

object User 
  def apply(data: UserData): User = User(None, data.email, data.password, ...)

请注意,fields match case user => ... 只是将您的引用“字段”重命名为“用户”,并且可以简化为案例语句的主体。

【讨论】:

伴生对象应该驻留在哪里?在 models.scala 中? 伴随对象应该与您的类定义位于同一个文件中(更多信息:docs.scala-lang.org/tutorials/tour/singleton-objects.html 感谢您的解决方案

以上是关于如何使用播放框架案例类绑定确认密码字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何在密码删除字符后,去除确认密码输入的字符?

jqGrid - 密码确认

JSON模式+相对JSON指针:如何验证“确认密码”字段

django登录注册验证之密码包含特殊字符,确认密码一致实现

密码和确认密码字段验证 angular2 反应形式

当用户单击flutter应用程序中的后缀图标时,如何一一显示密码和确认密码?