8

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

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

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

这很棒,因为

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

这很糟糕,因为

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

成功

array('success' => true);

失败

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

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

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

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

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

有一个更好的方法吗?我应该在控制器或方法中进行验证吗?我要疯了吗?

4

6 回答 6

6

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

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

我认为拥有执行表单验证规则以及 对格式良好的数据进行基本的模型内检查是可行的方法。如果您在模型的 validate() 函数中调用 Auth::instance() 或 Session::instance() ,那么您做错了。

于 2009-10-24T13:31:28.420 回答
4

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

于 2009-10-08T03:00:28.723 回答
2

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

于 2009-10-08T03:50:58.700 回答
0

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

于 2009-10-08T02:58:38.097 回答
0

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

于 2009-10-08T03:22:59.013 回答
0

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

于 2009-10-18T18:10:43.473 回答