2009-10-08 73 views
8

我使用Kohana,但我认为这个问题更一般。MVC项目应该在哪里进行验证?

我一直在做的控制器表单验证,它至今运作良好。但最近,我遇到了一个问题。

我有意见模式,我送从几个不同的控制器,以它的意见。我没有在每个控制器中都有验证器,而是将其放入模型中。

这是伟大的,因为

  • 只有一个地方改变/添加验证规则(DRY)

太差劲了,因为

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

成功

array('success' => true); 

ON FAIL

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

我不禁觉得这是不对的。它感觉错了。

如果我在控制器做到这一点,我可以简单地做

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

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

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

+0

这就是我如何做,然后检查成功索引以决定做什么(不是与科纳纳,但通常)。 – 2009-10-08 03:52:49

回答

4

我真的没有看到你的方法有什么问题,亚历克斯。看起来你正在做得很好。你遵循DRY原则,对我来说,这通常是衡量我是否正确地处理MVC的标准。

0

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

0

您应该始终(如果可以的话)验证客户端(JS)。而且,因为可以绕过 - 你也可以在服务器上进行验证。是的 - 把你的验证,可重复使用的一些形式是伟大的想法

+0

除非你只是想要移动你的答案的巨魔 - 给出礼貌解释你为什么给予-1到这个答案。在客户端验证 - 有意义的是,它返回服务器的速度要快得多。但仅依靠客户是很危险的,因为它很容易被规避。因此,我的回答 – Bostone 2009-10-18 19:24:43

+0

我认为你应该首先在答案中加倍努力,而不仅仅是在评论中。只是作为一名法官,我把这个混蛋放倒了。 :) – pestaa 2009-10-24 13:39:56

+0

谢谢:)并非我所有的答案都是这样简短的。我只是想把我的声音添加到合唱中 – Bostone 2009-10-24 16:30:56

2

发车型。小型控制器。这就是我一直这样做的方式。对我的验证是在数据层。数据层(对我来说至少)是模型。我通常使用CakePHP作为我的MVC框架......也许这就是为什么我的验证是在模型中。这是CakePHP的方式。

0

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

6

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

例如,这是一个登录用户采取的行动?你不会将你的认证层和被验证的模型耦合在一起。所以,所有的检查必须进入控制器内部。该模型是上下文无关的;表单“属于”控制器并且是上下文感知的。

我认为有合式数据每形式验证规则基本在模型检查是要走的路。如果你在你的模型的validate()函数内调用Auth :: instance()或Session :: instance(),那么你做错了。

相关问题