代码之家  ›  专栏  ›  技术社区  ›  Stephen Melrose

您应该在模型中验证吗?(基于symfony的问题,但与通用MVC相关)

  •  6
  • Stephen Melrose  · 技术社区  · 15 年前

    这是一个有关symfony的快速问题,但可能是一个一般的MVC问题。

    例如,我的模型中有一个类, WebUser .此类的属性为 email_address . 此值必须对每个 韦布斯 .

    现在,我已经做到了,所以我所有的symfony表单都验证了 电子邮件地址 对于给定的 韦布斯 不过,我想知道是否也应该将此验证添加到模型中?

    但这也让我想到,如果你真的验证 set() 模型中的方法?这似乎是一个明智的决定,可以确保数据库中没有错误的数据,但是大多数(如果不是全部)数据必须经过控制器,控制器也会进行验证。所以在我看来,我运行了两次相同的验证,这似乎毫无意义?

    你对此有何看法?我仍然倾向于在模型中进行验证,因为这是最有意义的,因为它决定了业务逻辑。

    如果您应该在模型中验证,那么如何抛出适当的 集() symfony中的错误是否由表单框架正确处理?

    谢谢。

    4 回复  |  直到 15 年前
        1
  •  6
  •   gpilotino    15 年前

    我不同意“验证应该是域逻辑的一部分,而不是前端逻辑”。

    验证是应用程序的一个复杂功能部分,并且 必须 注意上下文。例如,您必须知道用户是否登录,她拥有何种凭证,请求/表单的状态等等。取而代之的是模型 必须 与上下文无关(在任何环境中工作,不仅是HTTP请求,还包括CLI等),因此他们不了解用户、状态和HTTP请求。这是对模型类的可测试性的强烈要求。

    为了总结原因,功能验证 必须 属于知道应用程序状态的表单(即会话)。symfony确实对属于表单组件的sfvalidator*类有很大帮助。这就是为什么表格要用 功能性 测试。

    数据验证应该在模型中进行(例如,检查该值是整数还是字符串,检查它是否为空等等)。这很容易通过模式验证规则中的条令实现。

        2
  •  3
  •   Bryan M.    15 年前

    我不能专门和symfony说话,但我知道我有意避开zend框架的表单验证,而是在我的模型上进行验证(zend框架不提供自己的模型组件,因此它对此事没有实际的意见)。

    在表单上验证没有错,但我认为您还应该在模型上验证。在表单上验证可能对快速和简单的输入检查很有用,尤其是在处理逻辑复杂的情况下——您不会浪费时间处理明显不好的数据。

    我认为模型验证最好的原因是:

    • 模型在通过表单后进入数据库之前,有可能会更改数据。
    • 验证应该是域逻辑的一部分,而不是前端逻辑(我意识到symfony似乎不同意)。
    • 验证状态随模型对象而不是表单对象一起移动。

    如果您没有完全出售,只在模型中验证,这两种方法的组合听起来是一个很好的解决方案。

    编辑: 在一天结束的时候,在这个问题上使用您的框架可能是最有意义的。如果symfony在控制器中似乎最倾向于验证,并且在模型中不提供简单的验证路径,那么只需按照他们希望您做的(或symfony社区倾向的方向)进行即可。与你的框架作斗争从来都不是一件有趣的事。

        3
  •  0
  •   nocksock    15 年前

    对于symfony部分,我无能为力,但大多数MVC框架都在模型中进行验证,因为这是MVC环境中唯一需要验证的地方。
    当然,这是为了验证模型的属性。

        4
  •  0
  •   MArwan    15 年前

    我认为你应该使用MVC验证工具ket来使用别人依赖于modelstate它的easyer和testable,它的基础是formcollected,而不是给你自由运行方式的模型。

    马万哈菲兹