这是进行表单验证的好设计吗?

时间:2010-01-11 15:51:44

标签: php forms validation

对于我的框架,我已经写下了这个概念来解决表单验证问题。我希望它对框架用户尽可能简单。

每个Form(= object)都有一个或多个FormElements(= objects)。每个FormElement都可以有0-n FormValidators(= objects)。通过后端轻松配置的所有内容(简单的拖放操作)。

当呈现表单视图时,它会遍历所有FormElements,并且对于每个FormElements,它都会遍历所有相关的FormValidator。这样就构建了所有需要的JavaScript来验证客户端的表单。

FormValidator是一个轻量级对象,它只定义了这七件事:

  • 验证实用程序类的PHP类名称
  • 验证实用程序类的方法名称,必须调用
  • 其他参数的字符串(以逗号分隔的值)

  • 验证实用程序的JavaScript“class”名称

  • 必须调用的“方法”名称
  • 获取其他参数(以逗号分隔的值)

  • 关联的ErrorInfo对象,其中包含格式化的错误消息

这些验证方法中的每一个都将输入数据作为输入变量作为第一个参数。如果输入与某些规则匹配,则每个方法都只检查输入,并返回TRUE或FALSE。

提交表单后,会创建一个FormDataManager并接收:   - Form对象(因此它知道数据来自何处)   - 输入数据(通常为$ _POST)

然后只迭代所有FormElements,检查所有FormValidators,如果有什么无效,它会重新加载传递错误消息数组的Form。如果一切正常,则进一步处理数据(即存储到数据库)。

这种设计有改进吗?我错过了什么?

3 个答案:

答案 0 :(得分:3)

我认为您错过的一个常见验证概念是验证组。例如,您可能希望满足以下某种情况:

  • 仅当字段A具有任何值时,表单字段B才是必需的。
  • 仅当字段A具有特定值时,表单字段B才是必填字段。
  • 仅当字段A位于特定范围(数字或日期)时,表单字段B才是必填字段。
  • 字段A OR字段B需要有一个值(它们不能都是空的)。
  • 字段A OR字段B需要有一个值(它们不能都是空的或两者都有值) - (XOR)。
  • 密码和确认密码字段必须相同。

我确信还有其他方案,验证取决于其他表单元素的有效性或可选方面。此外 - 上述情景中的“强制性”也可能只是“适用”,这将是另一种情况。 这里的典型(医疗系统)示例是:“你是男性/女性吗?”,对女性进行了“你怀孕吗?”的跟进。或者与AOP相关的问题,如果您有生日,并且只有在他们年满65岁时才会有一个后续问题。

这意味着您需要一些验证组或验证关联对象,它们以有用和通用的方式包含这些依赖关系。

我想在你的设计中它意味着你也可以拥有FormValidator对象,这些对象不直接链接到一个FormElement,而是一个FormElements的组合,并在触发验证之前包含一个条件检查。

答案 1 :(得分:0)

听起来很有趣。我认为你走在正确的轨道上,特别是因为它听起来像是在验证客户端和服务器端。

答案 2 :(得分:0)

你应该做的一件事(我在阅读你的问题时可能会错过这个)是确保验证也发生在服务器上。这样,即使有人使用javascript关闭或修改,您的表单信息仍然会被验证。