0

我正在使用 Zend Framework 和 jQuery 开发一个 MVC 应用程序。My Model 由三层组成:Service Layer、Mapper、Domain Model。

迄今为止,我一直在努力进行输入验证——有些发生在客户端,有些发生在 Zend 表单中,有些发生在域模型中。职责变得混乱,有很多重复的逻辑。

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

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

我错过了什么吗?有什么需要注意的问题吗?

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

4

3 回答 3

1

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

于 2013-06-28T04:39:25.870 回答
1

您的域不适用于“在”客户端上执行任何操作。

反过来想:您在服务器上进行验证,作为额外的,您在客户端上进行验证以使您的用户满意。

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

然后,您也可以(作为用户的一项额外功能)在客户端上执行此操作,但这只是为了让用户更快地反馈输入过程中的错误。永远不要更换。它永远不会阻止用户做一些使你的模型处于无效状态的事情。

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

于 2013-06-28T13:48:31.303 回答
0

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

您面临的问题似乎是验证逻辑的乘法。所以在服务器端,你只想在一个地方强调你的验证,那就是域模型。这是优点:

优点:

  • 易于跟踪,规则直接在您的域模型中
  • 因为领域模型有验证,任何访问对象的类都可以进行验证
  • 当您的领域模型发生变化时,更自然地也更改验证

缺点:

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

目的:

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

Javascript 的验证:

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

于 2013-06-28T07:22:30.027 回答