输入过滤器/验证码是否属于控制器或域模型?

时间:2012-08-21 01:29:30

标签: php model-view-controller validation input-filtering

我一直在使用php一段时间,但我是OO php的新手。作为我自己的练习,我正在构建一个小型的MVC框架。

我意识到可能没有明确的答案,但我想知道:输入过滤器/验证码属于哪里?

它应该是解析请求的控制器的一部分吗?

或者在域模型中使用过滤器/验证代码更合适,以便每个域对象负责验证自己的信息。

非常感谢任何建议。

2 个答案:

答案 0 :(得分:4)

Controller不负责以任何方式,形状或形式进行验证。 Controller是表示层中的一部分,负责对用户输入做出反应。不要质疑它。

验证主要由domain objects负责,这是大多数域业务逻辑在模型层中结束的地方。一些验证是人们称之为“数据完整性检查”(比如确保用户名是唯一的)。这些约束由DB结构强制执行(如给定示例中的UNIQUE约束或某些其他约束中的NOT NULL。使用data mapper(或其他一些存储模式)保存域对象时,可能会引发一些exceptions。那些异常也可用于在特定域对象上设置错误状态。

如果您有表单,它将绑定到一个或多个域对象,这些域对象在发布表单时会对其进行验证。然后,当前视图从模型层请求信息,如果设置了错误状态,则显示相应的警告。

答案 1 :(得分:1)

控制器通常会处理请求数据(GET / POST)并检测模型不应该关注的无效表单提交,CSRF,缺失字段等。这是您编写大部分过滤代码的最可能的地方;验证应该只进行早期失败的完整性检查(例如,如果它不是有效的电子邮件地址,请不要费心向模型发送电子邮件地址。)

您的域对象也可能提供验证挂钩(甚至过滤),这会降低控制器的责任,但在大多数情况下,我个人觉得使用基于合同的模型更容易(模型假设您传递合法值)因为将验证问题直接转换为特定表单字段会更容易。

模型本身也可以进行验证,尽管与上述输入过滤(和内容类型验证)不同;例如,它可能会检查数据库中是否存在电子邮件,而不是确定它是有效的电子邮件地址。