【问题标题】:Where to put validation logic in MVC software architecture在 MVC 软件架构中放置验证逻辑的位置
【发布时间】:2011-11-11 17:45:04
【问题描述】:

其实我已经开始学习mvc架构了。

我对是否将我的用户名注册验证逻辑放在模型或控制器中感到困惑。

我有某种状态消息会告诉用户要注册的新用户名是否可用。

我的困惑开始了,因为大多数消息来源说它应该在模型中,因为它涉及在将用户名数据放入数据库之前对其进行验证(而不是检查用户名字段的输入)。但是,状态消息应该在用户按键或更改更改用户名字段之前立即响应,这使我认为它应该在控制器中,因为它涉及更多用户事件。

我真正关心的不是要使用的框架,而是涉及 MVC 的标准概念。根据上述条件/前提,我应该将用户名验证逻辑放在哪里?

【问题讨论】:

    标签: model-view-controller


    【解决方案1】:

    正如 Shikhar 所说,实际检查名称是否可接受/可用是模型的责任。控制器可以提供由页面上的某些 AJAX 调用的操作,以便在按下每个键时,页面上的文本被发送到专用的控制器操作,然后通过模型对其进行验证(任何涉及数据库的操作都是型号)。

    在视图中有几件事情需要考虑,例如当用户快速输入时,您应该在进行新的调用之前取消之前的调用,因为这会让人感到困惑。

    此外,当用户在数据输入结束时提交表单时发生的控制器发布操作应执行与 AJAX 操作相同的验证,以避免用户之间的竞争条件。

    【讨论】:

      【解决方案2】:

      它应该在您自己阅读的模型中。我认为您对“验证过程”和“验证规则”感到困惑。验证过程将在客户端的控制器中,但验证规则是模型的属性。

      【讨论】:

      • 就我的问题而言。哪一部分是验证过程,哪一部分是验证规则?
      • 如果您检查用户名是否有效,则在按键上 - 它的验证过程。如果您正在检查用户名是字母数字,它是一个验证规则,您可能已经得到了这样的 user->validationRule(user) 或 user->isValid()
      • 验证与数据库无关。
      • 我发现这个问题有一点很有趣,如果我遇到系统使用一种 jQuery 插件(客户端)验证所有输入然后在服务器端(模型)再次验证的情况。使用 jQuery(客户端)进行验证将是验证过程并在服务器端进行验证(模型将是验证规则)。对吗?
      • 没有两者都是验证过程,在一种情况下规则在客户端(jquery),在其他规则与模型(服务器端)
      【解决方案3】:

      作为对@Colin Desmond 的补充,模型实例永远不应包含“错误”数据,因此,在我看来,在 MVC 环境中应该包含验证逻辑。因此,无论模型实例在何处创建,都永远不会使用错误的数据对其进行初始化,并且对模型实例进行操作的类可以依赖其数据。例外情况是是否存在依赖于视图的验证逻辑。视图相关的逻辑(异常)应该在控制器中实现。

      例如,应在模型中实现电子邮件地址的验证。但是,模型可能允许负金额的银行交易,但视图 A 可能不允许负金额的交易。这个异常的逻辑应该在控制器上实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-08
        • 2011-04-23
        • 2019-12-27
        • 2012-07-22
        • 2013-01-20
        • 1970-01-01
        • 2012-09-12
        相关资源
        最近更新 更多