【发布时间】:2012-08-14 20:35:57
【问题描述】:
问题:
当使用 play framework 编程时,我觉得我遇到了与过去很多次相同的问题,即 创建多个相同类型的模型,只是因为我想添加、更新或在不同的用例中使用关于特定模型的不同数据。
让我解释一下,让我们考虑一个示例,其中我有 2 个不同的视图:register 和 login
我会有以下用户模型:
/**
* Example User class (simple annotations for demo purposes).
*
*/
@Entity
public class User {
@Id
public Long id;
@Required
public String email;
@Required
public String password;
@Required
public String firstName;
@Required
public String lastName;
}
在注册的情况下:我会在 register.scala.html 中拥有所有相应的字段:email、password、firstName、lastName - 因为当我需要它们时我注册了,对吧?
但我也想使用 repeatPassword 字段来确认用户输入的密码是否正确,所以我会将其添加到用户模型中:
@Required
@Transient
public String repeatPassword;
好的,那么我将扩展此模型以重复密码确认检查,以便在提交表单时更正我的“自动”验证,如下所示:
public String validate() {
if(!password.equals(repeatPassword)) {
return "Passwords doesn't match.";
}
return null;
}
}
所以即使现在我也会有一个额外的属性repeatPassword,它不会保存在数据库中,而是在注册时使用。
问题#1:我们的模型开始逐渐变得混乱。
在登录的情况下:我想使用相同的模型,因为它是一个正在尝试登录的用户,对吧?但我只需要电子邮件、密码而不是所有字段。
问题 #2: 我的 User 模型不能用于登录,因为它已经定制为在注册中使用 - 我需要移动 repeatPassword 和 validate() 方法来分离 UserRegistation 模型,加上重复firstName lastName 等字段或在注册中使用 User 和 UserRegistration 模型混合,并将两种不同的表单呈现到相同的注册视图 = 令人困惑。
问题#3:我的登录页面不能使用用户模型,因为它有注释,如果我不添加所有必要的字段,如名字、姓氏等。我会出错。同样,我需要创建单独的 UserLogin 模型只是因为我想登录工作。?示例如下:
public class UserLogin {
@Required
public String email;
@Required
public String password;
public String validate() {
if(User.authenticate(email, password) == null) {
return "Invalid user or password";
}
return null;
}
}
非常快,我将有 3 个不同的模型来代表用户,其中一个被持久化到数据库中,另外两个用于在我们在模板端完成登录和注册功能时验证错误。
所以我的问题是:我到底应该如何开始解决这个烂摊子?代码复杂性正在快速上升:) 我是否应该创建单独的 models.template 和 models.database 包,其中模板模型只是注释中的模型,并且在没有错误的情况下我开始填充真实模型,然后将其信息保存或更新到数据库?我迫切需要你们的答案,我们可以制作一种模型方法吗? 提前。
【问题讨论】:
标签: validation model-view-controller model playframework playframework-2.0