在MVC项目中应该在何处进行表单验证?

ale*_*lex 8 php validation model-view-controller kohana

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

我一直在控制器中进行表单验证,到目前为止它运行良好.但最近,我遇到了一个问题.

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

这很棒,因为

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

这很糟糕,因为

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

成功

array('success' => true);
Run Code Online (Sandbox Code Playgroud)

失败

array('success' => false, $errors);
Run Code Online (Sandbox Code Playgroud)

我不禁想到这是错的.这感觉不对.

如果我在控制器中这样做,我可以做到

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

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

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

gpi*_*ino 6

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

例如,这是一个登录用户采取行动?您不会将身份验证层与要验证的模型耦合.因此,所有检查必须进入控制器内部.该模型与上下文无关; 表单"属于"控制器并且是上下文感知的.

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


Ste*_*nte 4

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