关于用户输入验证的位置有几个讨论:
Should validation be done in Form objects, or the model?
Where do you do your validation? model, controller or view
这些讨论已经过时了,所以我想再问这个问题,看看是否有人有任何新的意见。如果没有,我提前道歉。
如果你来自模型阵营中的验证 - 模型是否意味着数据的OOP表示(即活动记录/数据映射器)为“实体”(借用DDD术语) - 在这种情况下,我认为,希望所有Model类继承常见的验证约束。或者这些规则只是模型中服务的一部分 - 即验证服务?例如,您是否可以将Zend_Form及其验证类视为模型的一部分?域模型的概念似乎并不局限于实体,因此验证可能不一定需要局限于此实体。
您似乎需要在表单和“实体”之间来回处理很多可能多余的值和响应 - 在某些情况下,您可能无法保留从用户输入收到的数据,或者从用户输入中接收数据一点都不。
答案 0 :(得分:2)
我更喜欢亲自在模型中进行验证。当然,安全性考虑因素超出了模型应该使用的范围,但没有任何内容表明模型仅通过一种形式在一个地方更新。通过在模型外部进行类型验证和健全性检查,您必须在每次设置任何内容时进行验证,这会导致复制/粘贴代码难以更新。
答案 1 :(得分:1)
我使用Zend_Form作为模型的一部分 - 模型正在创建Zend_Form对象。我这样做是因为Zend_Form不仅仅是表单渲染;使用Zend_Validate和Zend_Filter备份它是一个非常强大的工具(来自ZF堆栈的我的青睐)。 Matthew Weier O'Phinney写了一篇关于在模型中使用Zend_Forms的好文章:http://weierophinney.net/matthew/archives/200-Using-Zend_Form-in-Your-Models.html
答案 2 :(得分:1)
数据验证应该是独立的,在提交模型之前由控制器调用。
答案 3 :(得分:0)
没有使用PHP并且没有使用Zend框架(虽然已经听过),但我真的很喜欢Jimmy的blog post关于从域驱动设计角度进行验证。
答案 4 :(得分:0)
我考虑了许多不同的数据验证方法,并决定了最佳的验证方法 - 它是在实体创建之前的验证,因为验证它可以非常依赖于上下文,而实体本身不应该执行验证,因为实体应该始终处于有效状态。 所以也许最好的方法 - 在将数据传递给实体构造函数之前使用单独的验证类来验证数据。
答案 5 :(得分:-3)
处理用户输入时,您绝对应该处理模型外的所有面向逻辑的验证。
该模型不关心您的业务逻辑。模型并不关心您的开始日期是否在结束日期之后 - 所有模型关心的是日期是数据库中该特定字段的有效条目。它检查数据,查看格式正确的日期并转到下一个,因为模型的整个责任范围是确保数据流入和流出数据源。
像Zend_Form这样的类只不过是你观点的抽象。