MVC 架构中的数据和表单验证
Posted
技术标签:
【中文标题】MVC 架构中的数据和表单验证【英文标题】:Data and Form validation in MVC architecture 【发布时间】:2012-04-16 16:45:06 【问题描述】:我使用 CodeIgniter 开发我的大部分 Web 应用程序,并且一直采用在控制器内部验证表单数据的方法,使用内置的表单验证类,然后将此数据发送到要使用的模型,例如插入数据进入数据库。
但是,我不断听到“瘦控制器,胖模型”的说法——我想知道这些验证检查是否应该放在模型中。
当我想到使用这种方法时,我想到了三件事。
如何在不从这些模型函数返回看似丑陋的数组或对象的情况下向用户显示不同的错误消息?例如,注册帐户时的重复电子邮件。负责在模型中添加用户的方法是否必须返回一个数组或对象来指示插入是否成功以及任何错误消息?
通过在模型中进行验证检查,检查从控制器提供给方法的变量(不是 POST 数据),我将无法使用 Form Validation 类,我发现该类在我的项目。您是否建议我编写一个可以像 CI 库一样使用的类或库来模拟表单验证类,但对于提供的变量,并且不限于 POST 数据?
从这个问题开始......因为 POST 数据在传递给模型之前必须验证是否存在 (isset($_POST['myvar'])
),如果验证的其余部分不只是放在控制器中也一样?
任何建议、意见、意见将不胜感激!
【问题讨论】:
【参考方案1】:您最初的问题来自于 CodeIgniter 对 MVC 的解释非常骇人听闻的事实。这个框架假装 View 只是一个模板,而 Model 只是一个 ORM (which some say, should be classified as anti-pattern)。这是完全错误的,并且会强制控制器内部的机器人业务和表示逻辑。
但是让我们把 View 放在一边。
MVC 中的模型不是类或对象。 模型是一个层,它包含了所有的业务逻辑。它实际上由来自多个类的实例组成。两个最流行的组是域对象[1][2](人们通常称之为“模型”)和负责信息存储和检索的对象 - 通常是 @987654324 @。模型层还包含独立组件(您自己的和第 3 方)和更高级别的抽象 - 服务。
你所拥有的Validation
类,可能被认为是一个独立的组件,它可以被域对象用来执行验证,或者期望一个域对象 em> 传入验证.. 取决于您的实现。
在您的情况下,我将在服务层处理此问题。这将为View
类的实例提供一个有效的域对象,或者一个代表错误的对象。
一些你可能感兴趣的阅读材料:
GUI Architectures AnemicDomainModel Tell, Don't ask再一次..我到底知道这一切..
【讨论】:
感谢您非常详细的回复 - 我已经阅读了您的一些链接,很好!那么,您是否建议一种方法是在模型的方法内部进行验证并返回数据对象或描述/表示错误的对象?例如,在检索用户记录的方法中,如果提供了 id,则返回用户的对象,如果没有返回具有错误消息和状态码等的对象,您将如何在控制器中处理此问题?跨度> @Sam ,如果你想使用 ActiveRecord 对象,那么你将不得不在它里面。您应该创建某种 setter,它将验证器传递给对象,然后同时对您的字段集执行验证。如果发生错误,您可以抛出异常,然后在控制器(实际上在 CI 中,它是“presenter”)级别进行处理。以上是关于MVC 架构中的数据和表单验证的主要内容,如果未能解决你的问题,请参考以下文章
需要使用 MVC 中的表单验证从服务器端验证 DateTime