1

问题:

在使用 play framework 编程时,我觉得我遇到了与过去很多次相同的问题,因为我想在不同的用例中添加、更新或使用关于某个模型的不同数据,所以我创建了多个相同类型的模型.

让我解释一下,让我们考虑一个示例,其中我有 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 中拥有所有相应的字段:电子邮件、密码、名字、姓氏- 因为我在注册时将需要它们,对吗?

但我也想使用 repeatPassword 字段来确认用户是否正确输入了密码,所以我会将其添加到 User 模型中:

@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:我的登录页面不能使用用户模型,因为它有注释,如果我不添加所有必要的字段,如名字、姓氏等。我会得到错误。同样,我需要创建单独的 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 包,其中模板模型只是注释中的模型,并且在没有错误的情况下我开始填充真实模型,然后将其信息保存或更新到数据库?我迫切需要你们的答案,我们可以制作一种模型方法吗?提前谢谢。

4

1 回答 1

1

我将从最后开始:您不需要为changing passwordor使用整个模型loggin-in(也不需要创建单独的“非持久”子模型),虽然Form<YourModel>在填充大对象时很有用,但您可以只是避免它们并依靠普通DynamicForm

在这种情况下,它当然不会使用constraints在模型字段中添加注释,但您可以手动验证它们。

例如:在注册表单中,您可以检查诸如、、之类的@Required字段是否存在(提示:也添加和约束),您应该从字段中删除注释。emailfirstNamelastNameMinLengthMaxLength@Requiredpassword

接下来在检查表单是否没有任何错误之后,您可以检查它们是否相同password并且repeatedPassword它们相同,您还可以添加一些个人(建议)strength check- 很可能模型中的注释不可能。

在记录表单的情况下,事情变得更加容易:使用DynamicForm数据只是尝试找到现有User的给定结果,password如果结果null意味着,用户不存在或password无效。

最后,提示: Joscha Feth 提供了可用于 Play 2.0 的即用型、全栈authenticationauthorisation模块(我非常支持这种解决方案。)

于 2012-08-18T23:41:17.027 回答