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


Does input filter / validation code belong in the controller or the domain model?

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

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

它是否应该是控制器的一部分,在那里解析请求?

或者在域模型中设置过滤器/验证代码更合适,这样每个域对象都负责验证自己的信息。

任何建议都将不胜感激。

控制器不负责以任何方式、形状或形式进行验证。控制器是表示层中负责对用户输入做出反应的部分。不质疑。

验证主要由域对象负责,域对象是大多数域业务逻辑最终位于模型层中的地方。一些验证就是所谓的"数据完整性检查"(比如确保用户名是唯一的)。这些约束是由DB结构强制执行的(类似于给定示例中的UNIQUE约束或其他一些示例中的NOT NULL约束)。使用数据映射器(或其他存储模式)保存域对象时,它可能会引发一些exceptions。这些异常也可能被用来设置特定域对象的错误状态。

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

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

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

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