Php 输入筛选/验证代码属于控制器还是域模型?

Php 输入筛选/验证代码属于控制器还是域模型?,php,model-view-controller,validation,input-filtering,Php,Model View Controller,Validation,Input Filtering,我已经使用php有一段时间了,但我对OO php还是新手。为了锻炼自己,我正在构建一个小型MVC框架 我意识到这可能没有一个明确的答案,但我想知道:输入过滤器/验证代码属于哪里 它应该是解析请求的控制器的一部分吗 或者在域模型中使用筛选/验证代码更合适,以便每个域对象负责验证其自己的信息 任何建议都将不胜感激。控制器通常会处理请求数据(GET/POST),并检测模型不应关注的无效表单提交、CSRF、缺失字段等。这是最有可能编写大部分过滤代码的地方;验证只应进行早期故障的健全性检查(例如,如果电子

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

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

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

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


任何建议都将不胜感激。

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

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


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

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

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


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

请提供引文,说明控制器应该进行表单验证。@tereško我不是说控制器完全负责验证,然而,我确实认为,有时需要在模型“厚度”和更容易的错误反馈代码之间进行权衡。