【问题标题】:Does input filter / validation code belong in the controller or the domain model?输入过滤器/验证代码属于控制器还是域模型?
【发布时间】:2024-01-07 10:19:01
【问题描述】:

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

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

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

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

任何建议将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 请提供引文,说明控制器应进行表单验证。
      • @tereško 我并不是说控制器只负责验证,但我确实认为有时需要在模型“厚度”和更简单的错误反馈代码之间进行权衡。
      最近更新 更多