【问题标题】:Validation as property of the form作为表单属性的验证
【发布时间】:2011-02-24 14:59:07
【问题描述】:

在 CakePHP 框架中,验证规则是模型的一个属性。也就是说,数据来自哪里并不重要:当您想将其写入模型时,它必须通过验证。

在 symfony 中,您可以为每个表单指定验证规则。由于每个模型可能有多个表单(并且表单可能涉及来自不同模型的数据),因此某些模型的数据可能必须根据其来自的表单通过不同的过滤器。

我知道这可能偶尔有用,而且如果您愿意,CakePHP 确实提供了动态指定不同验证规则的方法。但这是例外,而不是规则。在我看来,另一种方式的设计为错误打开了大门,您可以在其中更新验证规则,但忘记检查所有表单。

另一方面,我确信 Fabien Potencier 比我更聪明,并且可能已经对这个设计进行了一些思考。所以我的问题是:

进行表单验证的充分理由是什么(通常,而不是例外)?

【问题讨论】:

  • 为什么投反对票?我认为这是一个关于设计选择的合理问题。 :-?
  • “在我看来,另一种方式的设计为错误打开了大门,您可以在其中更新验证规则,但忘记检查所有表单。”如果我正确理解您的担忧,您可以通过创建表单的子类并仅更改特定于该子类的验证器来避免这种情况。例如,要针对特定​​类型的用户表单将电子邮件限制到特定域,如 circusdei 的示例,请创建 class UserRegistrationForm extends UserForm 并将“全局”验证器替换为特定验证器。

标签: php validation cakephp symfony1


【解决方案1】:

我会说它们是两种不同的东西。

模型验证 - 验证进入模型的数据对持久性有效并保持业务逻辑完整性(常见的 CakePHP 验证)

表单数据过滤 - 验证表单是否使用可接受的值填写。显然有一些重叠,而且很多时候表单验证是由模型验证处理的。其他时候可能不是。

例如,表单可能需要知道复选框的状态,以便确定需要显示的向导的下一部分。这与模型无关,而是有效的验证要求。 (复选框或单选按钮在一组合法值中有一个值)

当然,使用 CakePHP,您可以轻松地编写一个组件/行为组合,使用验证数组中的键控索引来处理这两种情况。很容易设置一个始终使用的“默认”键,以及用于确定附加验证逻辑的每个“操作”的键。

如果您稍微搜索一下,甚至还有一些预先构建的解决方案。

【讨论】:

    【解决方案2】:

    你忘记了继承。这就是我的意思:

    • 基本验证规则来自您的数据库架构,字符串长度、字段类型等内容 - 这些都进入 BaseModelForm 类
    • 您可以轻松地在子类中覆盖这些内容,例如 ModelForm(建议您这样做,因为 Base~ 类是自动生成的,您将在下次重新生成时丢失修改)
    • 如果您需要更改一些验证器(或小部件),您可以再次对它们进行子类化。

    有时我对每个表单有不同的验证规则,比如一个用于后端,一个用于前端——即使它们处理的是同一个模型。基本规则来自自动生成的类,我更改了一些小部件和验证器,或者删除了一些。

    【讨论】:

      【解决方案3】:

      据我所知,有充分的理由: 1.形式少。 2. 功能大不相同的表格。 3. 电子邮件可能需要通过不同的验证(登录电子邮件可能需要具有来自 email@thisSite.com 的 URL,而注册电子邮件可以来自任何域)。

      【讨论】:

        猜你喜欢
        • 2011-12-18
        • 2017-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 2019-09-28
        相关资源
        最近更新 更多