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

时间:2012-04-03 02:27:39

标签: php model-view-controller codeigniter architecture

我使用CodeIgniter开发了大多数Web应用程序,并且在将此数据发送到要使用的Model之前,始终采用内置Form Validation类验证控制器内部的表单数据的方法,例如插入数据进入数据库。

但是,我一直听到“瘦小的控制器,脂肪模型”这一行 - 我想知道这些验证检查是否应放在模型中。

当我想到使用这种方法时,有三件事让我感到震惊。

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

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

  3. 继续关注...因为在传递给模型之前必须验证POST数据是否存在(isset($_POST['myvar'])),其余的验证是否应该放在控制器也是?

  4. 任何建议,建议,意见将不胜感激!

1 个答案:

答案 0 :(得分:4)

你的原始问题来自CodeIgniter对MVC的解释是非常可怕的。这个框架假装View只是一个模板,而Model只是一个ORM(which some say, should be classified as anti-pattern)。这是完全错误的,并强制控制器内部的机器人业务和表示逻辑。

但是让我们放弃观看。

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

您拥有Validation类的内容可能被视为独立组件,域对象可以使用它来执行验证,或者期望 Domain对象将被传递以进行验证..取决于您的实施。

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

有些阅读材料可能会引起人们的兴趣:

然后......我到底知道这一切......