2012-04-03 67 views
8

我使用CodeIgniter开发了大部分Web应用程序,并且在将此数据发送到模型之前,一直采用验证控制器内部的表单数据的方法,即使用内置的Form Validation类,被使用,例如将数据插入到数据库中。MVC架构中的数据和表单验证

但是,我不断听到“瘦控制器,胖模型”行 - 我想知道如果这些验证检查应放置在模型内。

当我想到使用这种方法时,有三件事引起了我的注意。

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

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

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

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

回答

4

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

但让我们把View放在一边。

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

你有什么作为Validation类,可能会被认为是一个独立的组件,它可以通过Domain对象被用来执行验证,或者期望Domain对象传递中进行验证..取决于在你的实施上。

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

一些阅读材料宇可能会感兴趣:

再说..地狱,我知道这一切什么..

+0

不错的答案,+1。 – 2012-04-03 08:10:30

+0

谢谢你的非常详细的回应 - 我读过你的一些链接,很好的阅读!那么,你是否建议一种方法可以在模型的方法内进行验证,并返回描述/表示错误的数据对象或对象? 如 在检索用户记录的方法,如果一个id供给,返回用户的对象,如果没有返回有错误消息和状态代码的对象,等 你会如何处理这在控制器中? – Sam 2012-04-03 14:48:36

+0

@Sam,如果你想使用ActiveRecord对象,那么你将不得不在它里面。你应该创建一些设置器,它将验证器传递给对象,然后在同一点对你的字段集进行验证。错误时,你可以抛出一个异常,然后你在控制器(实际上在CI中,它是“主持人”)处理。 – 2012-04-04 04:54:37