MVC架构中的数据和表单验证


Data and Form validation in MVC architecture

我使用CodeIgniter开发了大多数web应用程序,并且在将这些数据发送到要使用的模型(例如,将数据插入数据库)之前,一直使用内置的form Validation类在控制器内验证表单数据。

然而,我一直听到"瘦控制器,胖模型"的说法,我想知道这些验证检查是否应该放在模型内部。

当我想到使用这种方法时,有三件事让我印象深刻。

  1. 如何向用户显示不同的错误消息,而不从这些模型函数返回看似丑陋的数组或对象?注册帐户时的重复电子邮件。负责在模型中添加用户的方法是否必须返回一个数组或对象来指示插入是否成功,以及任何错误消息?

  2. 通过在模型中进行验证检查,检查从控制器提供给方法的变量(而不是POST数据),我将失去对Form validation类的使用,我发现这个类在我的项目中非常有用。您是否建议我编写一个类或库,它可以像CI库一样用于模拟Form Validation类,但用于提供的变量,而不限于POST数据?

  3. 继这一担忧之后。。。由于POST数据在传递到模型之前必须验证其存在性(isset($_POST['myvar'])),因此验证的其余部分是否也应该放在控制器中?

任何建议、建议、意见都将不胜感激!

您最初的问题源于CodeIgniter对MVC的解释非常糟糕。这个框架假设View只是一个模板,Model只是一个ORM(有人说,应该被归类为反模式)。这是完全错误的,并迫使机器人程序的业务和表示逻辑在控制器中。

但让我们把View放在一边。

MVC中的模型不是类或对象模型是一个层,它包含所有的业务逻辑。它实际上是由来自多个类的实例组成的。两个最常见的组是域;对象[1];[2] (这就是人们通常所说的"模型")和负责信息存储和检索的对象——通常是DataMappers。模型层还包含独立组件(包括您自己的组件和第三方组件)和更高级别的抽象-服务。

您所拥有的Validation类可能被视为一个独立的组件,它可以由域对象使用来执行验证,也可以期望传递领域对象来进行验证。。取决于您的实现。

在你的情况下,我会在服务层处理这个问题。它将为View类的实例提供一个有效的域对象,或者一个表示错误的对象。

你可能感兴趣的一些读物:

  • GUI体系结构
  • 贫血域模型
  • 告诉,不要问

再说一遍。。我到底知道什么。。