问题:
使用play框架进行编程时,我觉得我遇到了同样的问题,而不是过去很多次创建相同类型的几个模型只是因为我想添加,更新或在不同的用例中使用关于某个模型的不同数据。
让我解释一下,让我们考虑一个我有2种不同观点的例子:注册和登录
我会关注用户模型:
/**
* 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中找到所有相应的字段:电子邮件,密码,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:我的用户模型无法在登录时使用,因为它已经过定制以便在注册中使用 - 我需要移动repeatPassword和validate()方法来分离UserRegistation模型,再加上重复firstName lastName等字段或使用注册中的User和UserRegistration模型进行混合,并将两个不同的表单呈现给相同的注册视图=令人困惑。
问题#3:我的登录页面无法使用用户模型,因为它有注释,如果我没有添加所有必要的字段,如firstName,lastName等我将得到错误。同样,我需要创建单独的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个不同的模型来表示User,其中一个持久化到数据库,另外两个用于在模板端完成登录和注册功能时验证错误。
所以我的问题是:我究竟应该如何开始解决这个烂摊子?代码复杂性正在快速上升:)我应该创建单独的models.template和models.database包,其中模板模型只是注释中的一个,如果没有错误,我在保存或更新其信息到数据库之前开始填充真实模型?我需要你们/女孩的拼命回答,我们可以提出一种模式方法吗?提前thnx。
答案 0 :(得分:1)
我将从最后开始:您不需要为changing password
或loggin-in
使用整个模型(您也不需要创建单独的'非持久'子模型虽然Form<YourModel>
在填充大型对象时很有用,但您可以避免它们并依赖于常见的DynamicForm
。
在这种情况下,当然不会将constraints
添加注释添加到模型的字段中,但您可以手动验证它们。
例如:在注册表单中,您可以检查@Required
,email
,firstName
之类的lastName
字段是否存在(提示:还添加MinLength
和MaxLength
约束),但您应该从@Required
字段中删除password
注释。
接下来,在检查表单是否有任何错误后,您可以检查password
和repeatedPassword
是否相同且它们是否相同,您还可以添加一些个人(建议)strength check
- 很可能用模型中的注释是不可能的。
如果记录表单,事情会变得更容易:使用DynamicForm
数据只是尝试查找给定User
的现有password
,如果结果是null
,则意味着,用户不存在或password
无效。
最后,提示:有一个随时可用的全栈authentication
and authorisation
module available for Play 2.0 by Joscha Feth(我非常支持这个解决方案。)