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