我使用 CodeIgniter 开发我的大部分 Web 应用程序,并且在将此数据发送到要使用的模型之前,总是采用在 Controller 内部验证表单数据的方法,使用内置的表单验证类,例如插入数据进入数据库。
但是,我一直听到“瘦 Controller ,胖模型”这句话 - 我想知道是否应该将这些验证检查放在模型中。
当我想到使用这种方法时,有三件事让我印象深刻。
如何向用户显示不同的错误消息,而不从这些模型函数返回看似丑陋的数组或对象?例如,关于注册帐户的重复电子邮件。负责在模型中添加用户的方法是否必须返回一个数组或对象以指示插入是否成功以及任何错误消息?
通过在模型中进行验证检查,检查从 Controller 提供给方法的变量(不是 POST 数据),我将失去 Form Validation 类的使用,我发现该类在我的工作中非常有用项目。您是否建议我编写一个类或库,可以像 CI 库一样使用来模拟表单验证类,但用于提供的变量,而不限于 POST 数据?
从这个问题开始......因为 POST 数据在传递给模型之前必须验证其存在 (
isset($_POST['myvar'])
) , 其余的验证是否也应该放在 Controller 中?
任何建议、建议、意见将不胜感激!
最佳答案
您最初的问题来自于 CodeIgniter 对 MVC 的解释非常令人震惊。这个框架假装 View 只是一个模板,而 Model 只是一个 ORM ( which some say, should be classified as anti-pattern )。这是完全错误的,并强制 Controller 内部的机器人业务和表示逻辑。
但是让我们把 View 放在一边。
MVC 中的模型不是类或对象。 Model是一个层,里面包含了所有的业务逻辑。它实际上由来自多个类的实例组成。最普遍的两个组是领域对象[ 1 ] [ 2 ](这就是人们通常所说的“模型”)和负责信息存储和检索的对象 - 通常是 DataMappers .模型层还包含独立组件(您自己的和第 3 方)和更高级别的抽象 - 服务。
您拥有的 Validation
类可能被认为是一个独立的组件,它可以被 Domain object 用来执行验证,或者期望一个 要传入以进行验证的域对象.. 取决于您的实现。
在你的情况下,我会在服务层处理这个问题。这将为 View
类的实例提供一个有效的域对象,或者一个表示错误的对象。
你可能感兴趣的一些阅读 Material :
再一次..我到底知道些什么..
关于php - MVC 架构中的数据和表单验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9986333/