【问题标题】:Where should form validation occur in a MVC project?在 MVC 项目中应该在哪里进行表单验证?
【发布时间】:2009-10-08 02:44:38
【问题描述】:

我正在使用 Kohana,但我认为这个问题更笼统。

我一直在控制器中进行表单验证,到目前为止效果很好。但是最近,我遇到了一个问题。

我有一个 cmets 模型,我从几个不同的控制器向它发送 cmets。我没有在每个控制器中都有一个验证器,而是将它放在模型中。

这很好,因为

  • 只需一处更改/添加验证规则 (DRY)

这很糟糕,因为

  • 我显然需要向控制器返回成功或失败,而 Kohana 的验证库将错误作为数组返回。所以我的回报是这样的

成功

array('success' => true);

失败

array('success' => false, $errors);

我不禁认为这是错误的。 感觉错了。

如果我在控制器中做,我可以简单地做

if ($post->validate()) {
     doWhatever();
} else {
     $this->template->formErrors = $post->errors('form_errors');
}

这似乎更好(对我来说)。

有没有更好的方法来做到这一点?我应该在控制器或方法中进行验证吗?我要疯了吗?

【问题讨论】:

  • 我就是这样做的,然后检查成功指数以决定做什么(不是用 Kohona,而是一般。)

标签: php model-view-controller validation kohana


【解决方案1】:

我认为并非所有验证规则都可以进入模型。验证是关于 form(或 API)的。事实上,当您验证数据时,大部分事情都取决于上下文。

例如,这是一个登录用户执行的操作吗?您不会将身份验证层与正在验证的模型结合起来。因此,所有检查都必须在控制器内部进行。该模型与上下文无关;表单“属于”控制器并且是上下文感知的。

我认为per-form 验证规则plus basic 在模型中检查格式正确的数据是可行的方法。如果你在模型的 validate() 函数中调用 Auth::instance() 或 Session::instance(),那么你做错了。

【讨论】:

    【解决方案2】:

    老实说,我看不出你的方法有什么问题,亚历克斯。看起来你做得很好。您遵循 DRY 原则,对我来说,这通常是衡量我在 MVC 方面是否做对的标准。

    【讨论】:

      【解决方案3】:

      胖模特。小型控制器。这就是我一直这样做的方式。对我的验证是在数据层。数据层(至少对我而言)是模型。我通常使用 CakePHP 作为我的 MVC 框架......也许这就是我在模型上进行验证的原因。这是 CakePHP 的方式。

      【讨论】:

        【解决方案4】:

        我宁愿不要重复自己的感受,做的方法。此外,数组很方便,因为如果需要,您可以在视图中显示数组中的错误。我没有使用过 kohana,但是我在 ASP.NET MVC 中使用的验证方法为我提供了一个类似的列表,然后我可以向用户展示究竟是什么错误。

        【讨论】:

          【解决方案5】:

          您应该始终(如果可以)在客户端 (JS) 上进行验证。而且由于可以绕过它-您也可以在服务器上进行验证。是的 - 将您的验证放入一些可重用的形式是个好主意

          【讨论】:

          • 除非你只是想提高你的答案 - 礼貌地解释你为什么给这个答案 -1。在客户端验证 - 有意义的是,它比返回服务器要快得多。但是仅仅依靠客户是危险的,因为它很容易被规避。因此我的回答
          • 我认为您应该首先在答案中投入更多精力,而不仅仅是在评论中。只是为了作为一名法官,我补偿了那个混蛋投反对票。 :)
          • 谢谢 :) 并非我所有的答案都这么短。我只是想把我的声音添加到合唱中
          【解决方案6】:

          我也在模型中进行验证。大多数建模库(如 ORM、Auto_Modeler 等)也支持验证。 顺便说一句,如果您在 FreeNode (irc.freenode.net) 上的#kohana 频道上提问,它会更快。我们(通常)不咬人:)

          【讨论】:

            猜你喜欢
            • 2023-03-21
            • 2017-05-06
            • 1970-01-01
            • 1970-01-01
            • 2018-07-03
            • 2015-06-12
            • 1970-01-01
            • 2012-12-09
            • 1970-01-01
            相关资源
            最近更新 更多