MVC 问题:我应该将表单验证规则放在控制器还是模型中?

2022-08-30 10:35:31

一方面,表单验证可以被视为应用程序逻辑的一部分,因此属于模型。

另一方面,它直接处理来自视图的输入并处理显示错误等。从这个角度来看,将其放入控制器更有意义。

从MVC的角度来看,哪一个是正确的方法?

PS我的表单验证实际上只包括编写字段列表,其规则,并将其传递到表单验证库,该库在是否通过验证时返回true/false。

例:

$this->load->library('form_validation');
$this->form_validation->set_rules('name', 'Name', 'required');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email');
//........
if ($this->form_validation->validate())
    // Process data
else
    $this->register_form(); //A controller action that will show a view with errors

这应该放在控制器或模型中吗?


答案 1

理想情况下,您需要 3 层验证:

  1. 视图:客户端(javascript,html5验证等)。这会在数据到达控制器之前捕获明显的错误和遗漏,浪费用户的时间,并在出现错误时调用不必要的页面加载。
  2. 控制器这是表单验证层。控制器通常用于直接处理输入,并将其发送到模型。表单中的每个字段在数据库中都有一个直接相关的列是非常罕见的,您通常需要在将数据传递到模型之前以某种方式更改数据。仅仅因为您需要验证一个名为“确认电子邮件”的字段,并不意味着您的模型将处理“确认电子邮件”值。有时,这将是最后的验证步骤。
  3. 模型:这是验证的最后一道防线,也可能是在将数据发送到模型而不直接来自表单帖子的情况下唯一的验证。很多时候,您需要从控制器调用或使用非用户输入的数据将数据发送到数据库。我们不希望看到数据库错误,我们希望看到应用程序本身引发的错误。模型通常不应该直接处理_POST美元数据或用户输入,它们应该从控制器接收数据。您不想在这里处理无用的数据,例如电子邮件确认。

答案 2

验证是模型的问题。只有模型知道数据的外观。在模型中描述数据字段,因此应在同一位置描述此字段的验证规则。

这对我来说似乎是显而易见的,但我很乐意听取对手的意见。


推荐