玩框架2:一种模式方法

时间:2012-08-18 20:26:28

标签: validation model-view-controller model playframework playframework-2.0

问题:

使用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。

1 个答案:

答案 0 :(得分:1)

我将从最后开始:您不需要为changing passwordloggin-in使用整个模型(您也不需要创建单独的'非持久'子模型虽然Form<YourModel>在填充大型对象时很有用,但您可以避免它们并依赖于常见的DynamicForm

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

例如:在注册表单中,您可以检查@RequiredemailfirstName之类的lastName字段是否存在(提示:还添加MinLengthMaxLength约束),您应该从@Required字段中删除password注释。

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

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

最后,提示:有一个随时可用的全栈authentication and authorisation module available for Play 2.0 by Joscha Feth(我非常支持这个解决方案。)