我一直在使用php一段时间,但我是OO php的新手。作为我自己的练习,我正在构建一个小型的MVC框架。
我意识到可能没有明确的答案,但我想知道:输入过滤器/验证码属于哪里?
它应该是解析请求的控制器的一部分吗?
或者在域模型中使用过滤器/验证代码更合适,以便每个域对象负责验证自己的信息。
非常感谢任何建议。
答案 0 :(得分:4)
Controller不负责以任何方式,形状或形式进行验证。 Controller是表示层中的一部分,负责对用户输入做出反应。不要质疑它。
验证主要由domain objects负责,这是大多数域业务逻辑在模型层中结束的地方。一些验证是人们称之为“数据完整性检查”(比如确保用户名是唯一的)。这些约束由DB结构强制执行(如给定示例中的UNIQUE
约束或某些其他约束中的NOT NULL
。使用data mapper(或其他一些存储模式)保存域对象时,可能会引发一些exceptions
。那些异常也可用于在特定域对象上设置错误状态。
如果您有表单,它将绑定到一个或多个域对象,这些域对象在发布表单时会对其进行验证。然后,当前视图从模型层请求信息,如果设置了错误状态,则显示相应的警告。
答案 1 :(得分:1)
控制器通常会处理请求数据(GET / POST)并检测模型不应该关注的无效表单提交,CSRF,缺失字段等。这是您编写大部分过滤代码的最可能的地方;验证应该只进行早期失败的完整性检查(例如,如果它不是有效的电子邮件地址,请不要费心向模型发送电子邮件地址。)
您的域对象也可能提供验证挂钩(甚至过滤),这会降低控制器的责任,但在大多数情况下,我个人觉得使用基于合同的模型更容易(模型假设您传递合法值)因为将验证问题直接转换为特定表单字段会更容易。
模型本身也可以进行验证,尽管与上述输入过滤(和内容类型验证)不同;例如,它可能会检查数据库中是否存在电子邮件,而不是确定它是有效的电子邮件地址。