Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这是进行表单验证的好设计吗?_Php_Forms_Validation - Fatal编程技术网

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

Php 这是进行表单验证的好设计吗?,php,forms,validation,Php,Forms,Validation,对于我的框架,我写下了这个概念来解决表单验证问题。我希望它对框架用户来说尽可能简单 每个表单(=对象)都有一个或多个FormElements(=对象)。每个FormElement可以有0-n个FormValidator(=对象)。一切都可以通过后端轻松配置(简单的拖放功能) 呈现表单视图时,它会循环所有FormElement,对于每个FormElement,它会循环所有关联的FormValidator。通过这种方式,它构建了在客户端验证表单所需的所有JavaScript FormValidato

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

每个表单(=对象)都有一个或多个FormElements(=对象)。每个FormElement可以有0-n个FormValidator(=对象)。一切都可以通过后端轻松配置(简单的拖放功能)

呈现表单视图时,它会循环所有FormElement,对于每个FormElement,它会循环所有关联的FormValidator。通过这种方式,它构建了在客户端验证表单所需的所有JavaScript

FormValidator是一个轻量级对象,它只定义以下七个方面:

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

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

  • 必须调用的“方法”名称
  • 附加参数的字符串(逗号分隔的值)

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

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

提交表单时,将创建FormDataManager并接收: -表单对象(因此它知道数据来自何处) -输入数据(通常为$u POST)

然后它只需迭代所有FormElement,检查它们的所有FormValidator,如果有任何内容无效,它将重新加载传递给错误消息数组的表单。如果一切正常,则进一步处理数据(即存储到数据库)


这个设计有改进吗?我遗漏了什么?

我认为您遗漏了一个常见的验证概念,即验证组。例如,您可能希望满足以下情况之一:

  • 仅当字段A有任何值时,表单字段B才是必需的
  • 仅当字段A具有特定值时,表格字段B才是必填字段
  • 仅当字段A在特定范围内(数字或日期)时,表格字段B才是必填字段
  • 字段A或字段B都需要有一个值(它们不能都为空)
  • 字段A或字段B需要有一个值(它们不能都为空或都有值)-(XOR)
  • 密码和确认密码字段必须相等
我敢肯定还有其他场景,验证取决于其他表单元素的有效性或可选方面。此外,上述场景中的“强制性”也可能只是“适用”,这将是另一种情况。 这里典型的(医疗系统)例子是:“你是男/女吗?”,女性的后续回答是“你怀孕了吗?”。或者与AOP相关的问题,你有生日,只有当他们65岁或以上时才有后续问题

这意味着您需要一些validationgroup或validation association对象,这些对象以一种有用且通用的方式包含这些依赖项


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

听起来很有趣。我认为您的思路是正确的,特别是因为听起来您正在验证客户端和服务器端。

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

另一个典型的例子是:在注册过程中,密码和重复密码需要相同。谢谢Josef-yep,这的确很常见!编辑。谢谢Wim,我同意所有观点。完全有道理。我还记得Microsoft Outlook或Outlook Express有一个类似的系统,具有非常强大的规则。。。比如“如果主题包含FOO或BAR或FOOBAR,并且文本以Hello开头,请删除电子邮件”。我得弄清楚怎么做这样的事,太普通了。很酷的东西!是的,尽管Outlook Express规则只是与各种运算符的基本字符串比较。您可能需要进行正则表达式验证、范围验证(针对不同的数据类型)以及复选框列表(至少选择3个选项)等验证,这使得验证更具挑战性。祝你好运我仍然认为你应该把它上传到谷歌代码、sourceforge或git,这样我们就可以预览你的框架了客户端用于可用性,服务器端用于安全性。