使用良好的域模型忘记服务器端表单验证?

时间:2013-06-28 04:20:52

标签: javascript validation design-patterns domain-model

我正在使用Zend Framework和jQuery开发MVC应用程序。我的模型由三层组成:服务层,映射器,域模型。

到目前为止,我一直在努力进行输入验证 - 有些发生在客户端上,有些发生在Zend表单中,有些发生在域模型中。责任变得混乱,并且存在许多重复的逻辑。

在考虑之后,我看不出有什么理由不跳过任何Zend Form验证。我可以使用javascript验证简单的东西(包括正则表达式),并在需要时从服务器获取其他数据(通过ajax)。当表单通过验证时,我会将其传递给服务器。

当然我的域模型逻辑需要是全面的(复制客户端上的所有内容),但是域模型还有什么用呢,对吧?

我错过了什么吗?有什么值得注意的吗?

编辑:为了清楚起见,我并不是建议放弃服务器端验证。 (我意识到这是必要的。)我建议如果我的域模型做到了,也没有必要在表单中这样做。

3 个答案:

答案 0 :(得分:1)

否。任何人都可以修改您的客户端Javascript并强制您的客户端代码提交他们想要提交的内容。因此,您的服务器应采取不信任的态度(未经验证)客户端发送的任何。客户端验证不存在以保证安全性,也不保护数据的完整性。仅存在客户端验证以改善用户体验。通过客户端验证,您的网站可以告知用户有关错误的信息,而无需进行服务器往返,从而降低用户完成的任何任务的摩擦。

答案 1 :(得分:1)

在您在客户端上执行此操作后,您的域名不会执行任何操作。

反过来考虑一下:您在服务器上进行验证,并在客户端上进行验证,以使您的用户满意。

首先,您应该确保您要验证的内容应该首先在域模型上完成(可能在set()方法中)。

然后你可以(作为你的用户的一个额外功能)也可以在客户端上执行此操作,但它必须能够在输入时为用户提供更快的错误反馈。绝不是替代品。它永远不会阻止用户做一些使你的模型处于无效状态的事情。

此外,当您使模型持久化时,您应始终检查它是否处于有效状态。无效的内容会使其无效,因此您不应该保存它。此外,当您将更改应用于应用程序中的多个模型(实体)时,请确保执行事务,验证两个模型并确保其中没有一个模型保存在无效状态。

答案 2 :(得分:0)

这是Zend / php特有的问题吗?如果是,那么我的答案可能不适用。

您面临的问题似乎是验证逻辑的倍增。因此,在服务器端,您只想在一个地方强调验证,而它是域模型。这是专业人士:

优点:

  • 易于跟踪,规则直接针对您的域模型
  • 由于域模型具有验证功能,因此访问该对象的任何类都可以进行验证
  • 当您的域模型发生变化时,更改验证
  • 更为自然

缺点:

  • 不-可重复使用的。特别是在具有继承和接口的OOP处,验证不能用于具有类似结构的其他域模型(可能是派生类)。但是,这种情况可能不适用于php。
  • 非灵活的验证逻辑。对于不同状态的同一对象,您将需要不同的验证规则。例如,如果要保存请求,则草稿的验证将有所不同(可能有一些字段为空),已发布,可能已完成或已过时。

目的:

通常我会通过创建一些负责验证的特定类来进行验证,而不是域模型。我可以解决这两个缺点,因为它可重用且灵活(我可以使用DraftValidator,PublishedValidator)。验证结果可能非常通用,例如具有错误消息和isValid属性。

Javascript验证:

可以在javascript级别进行验证,尤其是向用户提供响应式反馈,而不是等待服务器的请求/响应之旅。