【问题标题】:Define "Validation in the Model"定义“模型中的验证”
【发布时间】:2010-06-07 15:36:24
【问题描述】:

关于用户输入验证的位置有几个讨论:

Should validation be done in Form objects, or the model?

Where do you do your validation? model, controller or view

这些讨论已经很老了,所以我想再次问这个问题,看看是否有人有任何新的意见。如果没有,我提前道歉。

如果您来自模型阵营的验证 - 模型是否意味着将数据(即 Active Record/Data Mapper)的 OOP 表示为“实体”(借用 DDD 术语) - 在这种情况下,我假设,希望所有模型类都继承通用的验证约束。或者这些规则可以只是模型中服务的一部分 - 即验证服务?例如,您可以考虑 Zend_Form 和它的验证类模型的一部分吗?域模型的概念似乎并不局限于实体,因此验证可能不一定需要局限于此实体。

您似乎需要在表单和“实体”之间来回处理大量可能多余的值和响应 - 在某些情况下,您可能不会保留从用户输入接收的数据,或者从用户输入接收数据完全没有。

【问题讨论】:

    标签: php validation model domain-driven-design


    【解决方案1】:

    我个人更喜欢将验证放入模型中。安全性考虑当然超出了模型的用途范围,但没有什么说模型在一个地方以一种形式更新。通过将类型验证和健全性检查放在模型之外,每次在模型上设置任何内容时都必须进行验证,这会导致复制/粘贴的代码难以更新。

    【讨论】:

      【解决方案2】:

      我使用 Zend_Form 作为我的模型的一部分——模型正在创建 Zend_Form 对象。我这样做是因为 Zend_Form 不仅仅是表单渲染;在 Zend_Validate 和 Zend_Filter 的支持下,它是一个非常强大的工具(我最喜欢来自 ZF 堆栈)。 Matthew Weier O'Phinney 写了一篇关于在模型中使用 Zend_Forms 的好文章:http://weierophinney.net/matthew/archives/200-Using-Zend_Form-in-Your-Models.html

      【讨论】:

        【解决方案3】:

        数据验证应该单独进行,由控制器在提交模型之前调用。

        【讨论】:

          【解决方案4】:

          没有使用过 PHP,也没有使用过 Zend 框架(虽然听说过),但我真的很喜欢 Jimmy 的 blog post 从域驱动设计角度进行验证。

          【讨论】:

            【解决方案5】:

            我考虑了许多不同的数据验证方法,并决定了最好的验证方式 - 它是在创建实体之前进行验证,因为验证它可能非常依赖于上下文,并且实体本身不应该执行验证,因为实体应该始终处于有效状态。 所以也许是最好的方法 - 在将数据传递给实体构造函数之前使用单独的验证类来验证数据。

            【讨论】:

              【解决方案6】:

              在处理用户输入时,您绝对应该处理模型之外的所有面向逻辑的验证。

              模型不关心您的业务逻辑。该模型不关心您的开始日期是否在您的结束日期之后 - 模型所关心的只是日期是数据库中该特定字段的有效条目。它检查数据,查看格式正确的日期并继续下一个日期,因为模型的全部职责是确保数据在数据源中的顺畅流动。

              像 Zend_Form 这样的类只不过是您的视图的抽象。

              【讨论】:

              • 这是对模型的有趣解释。它不被其他环境/语言共享。
              • 我将赏金授予 Jarrod - 我一直在等待是否有普遍的意见共识,但从这篇文章和其他帖子中,我看到这是一个有争议的问题。就个人而言,我怀疑使用通用验证类比在每个模型中编写(或子类化)验证规则更干。
              猜你喜欢
              • 2011-08-11
              • 2013-01-01
              • 2012-09-08
              • 1970-01-01
              • 2016-04-25
              • 1970-01-01
              • 1970-01-01
              • 2012-01-29
              • 1970-01-01
              相关资源
              最近更新 更多