我正在使用Zend Framework和jQuery开发MVC应用程序。我的模型由三层组成:服务层,映射器,域模型。
到目前为止,我一直在努力进行输入验证 - 有些发生在客户端上,有些发生在Zend表单中,有些发生在域模型中。责任变得混乱,并且存在许多重复的逻辑。
在考虑之后,我看不出有什么理由不跳过任何Zend Form验证。我可以使用javascript验证简单的东西(包括正则表达式),并在需要时从服务器获取其他数据(通过ajax)。当表单通过验证时,我会将其传递给服务器。
当然我的域模型逻辑需要是全面的(复制客户端上的所有内容),但是域模型还有什么用呢,对吧?
我错过了什么吗?有什么值得注意的吗?
编辑:为了清楚起见,我并不是建议放弃服务器端验证。 (我意识到这是必要的。)我建议如果我的域模型做到了,也没有必要在表单中这样做。
答案 0 :(得分:1)
否。任何人都可以修改您的客户端Javascript并强制您的客户端代码提交他们想要提交的内容。因此,您的服务器应采取不信任的态度(未经验证)客户端发送的任何。客户端验证不存在以保证安全性,也不保护数据的完整性。仅存在客户端验证以改善用户体验。通过客户端验证,您的网站可以告知用户有关错误的信息,而无需进行服务器往返,从而降低用户完成的任何任务的摩擦。
答案 1 :(得分:1)
在您在客户端上执行此操作后,您的域名不会执行任何操作。
反过来考虑一下:您在服务器上进行验证,并在客户端上进行验证,以使您的用户满意。
首先,您应该确保您要验证的内容应该首先在域模型上完成(可能在set()方法中)。
然后你可以(作为你的用户的一个额外功能)也可以在客户端上执行此操作,但它必须能够在输入时为用户提供更快的错误反馈。绝不是替代品。它永远不会阻止用户做一些使你的模型处于无效状态的事情。
此外,当您使模型持久化时,您应始终检查它是否处于有效状态。无效的内容会使其无效,因此您不应该保存它。此外,当您将更改应用于应用程序中的多个模型(实体)时,请确保执行事务,验证两个模型并确保其中没有一个模型保存在无效状态。
答案 2 :(得分:0)
这是Zend / php特有的问题吗?如果是,那么我的答案可能不适用。
您面临的问题似乎是验证逻辑的倍增。因此,在服务器端,您只想在一个地方强调验证,而它是域模型。这是专业人士:
优点:
缺点:
目的:
通常我会通过创建一些负责验证的特定类来进行验证,而不是域模型。我可以解决这两个缺点,因为它可重用且灵活(我可以使用DraftValidator,PublishedValidator)。验证结果可能非常通用,例如具有错误消息和isValid
属性。
Javascript验证:
可以在javascript级别进行验证,尤其是向用户提供响应式反馈,而不是等待服务器的请求/响应之旅。