Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MVC项目中的表单验证应该在哪里进行?_Php_Model View Controller_Validation_Kohana - Fatal编程技术网

Php MVC项目中的表单验证应该在哪里进行?

Php MVC项目中的表单验证应该在哪里进行?,php,model-view-controller,validation,kohana,Php,Model View Controller,Validation,Kohana,我用的是Kohana,但我觉得这个问题更一般 我一直在控制器中进行表单验证,到目前为止效果很好。但是最近,我遇到了一个问题 我有一个评论模型,我从几个不同的控制器向它发送评论。我没有在每个控制器中都有一个验证器,而是将它放在模型中 这很好,因为 只有一个地方可以更改/添加验证规则(干式) 这很糟糕,因为 我显然需要向控制器返回成功或失败,而Kohana的验证库将错误作为数组返回。所以我的回报是这样的 论成功 array('success' => true); 失败时 array(

我用的是Kohana,但我觉得这个问题更一般

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

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

这很好,因为

  • 只有一个地方可以更改/添加验证规则(干式)
这很糟糕,因为

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

array('success' => true);
失败时

array('success' => false, $errors);
我忍不住认为这是错误的。感觉不对

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

if ($post->validate()) {
     doWhatever();
} else {
     $this->template->formErrors = $post->errors('form_errors');
}
(对我来说)哪个更好


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

我不想在感情上重复自己,用这种方法。此外,数组非常方便,因为如果需要,可以在视图中显示数组中的错误。我没有使用过kohana,但是我在ASP.NET MVC中使用的验证方法为我提供了一个类似的列表,然后我可以向用户显示到底是什么错误。

alex,老实说,我看不出你的方法有任何错误。看来你做得很好。你遵循的是干燥原则,对我来说,这通常是衡量我在MVC方面是否做得对的标准

您应该始终(如果可以的话)在客户端(JS)上进行验证。由于这可以绕过,所以您也可以在服务器上进行验证。是的,将您的验证放在一些可重用的表单上是一个好主意。小型控制器。我总是这样做的。对我来说,验证是在数据层进行的。数据层(至少对我来说)就是模型。我通常使用CakePHP作为我的MVC框架。。。也许这就是为什么我要在模型上验证。这是CakePHP的方式。

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

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

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


我认为,在模型中检查格式良好的数据时,最好使用每表单验证规则加上基本规则。如果您在模型的validate()函数中调用Auth::instance()或Session::instance(),那么您就做错了。

我就是这样做的,然后检查成功索引以决定要做什么(不是使用Kohona,而是通常情况下)除非你是一个只想把答案向上移动的巨魔,否则请礼貌地解释一下你为什么给这个答案-1。在客户机上进行验证——有意义的是,它比返回服务器要快得多。但仅仅依靠客户是危险的,因为它很容易被规避。因此,我的回答是:我认为你首先应该在答案上投入更多的精力,而不仅仅是在评论上。就因为我是个法官,我陪着那个混蛋走了谢谢:)不是我所有的答案都这么短。我只是想在合唱中加入我的声音