在Yii中执行“大规模分配”时是否执行了验证?

时间:2012-02-11 15:46:13

标签: validation yii

我读过一篇文章"Understanding "Safe" Validation Rules"

作者说:

  

关键点 - 仅对具有的字段进行大量分配   通过一些明确的验证规则。显而易见的“实际”验证器    - 长度,电子邮件,要求等 - 所有符合条件,但有些字段是自由格式和可选字段,并且没有任何格式要求 -   用户可以放任何他喜欢的东西,包括留空。

但是有comment

  

我承认我没有花时间彻底证实这一点,但是   我记得,你把验证结合起来是不正确的   与任务。如果记忆正确,那么当你做大量的时候   赋值($ model-> setAttributes($ _ POST ['Model'])),没有实际的   验证发生。相反,对于POST / GET中的每个属性   数组,模型检查该属性是否安全分配   (通过检查是否存在验证或安全规则   属性,没有实际验证它) - 如果有,那么它设置   属性,如果没有,它会忽略它。

     

仅在您调用$ model-> save()(或   显式$ model-> validate()),当已经存在的属性   已使用验证规则检查已分配。

     

值得一提的是,大规模的任务和个人   赋值实际上并不等同 - 大量的赋值检查   是否存在每个属性的验证或安全规则,而   如果你进行个人作业($ model-> attribute =   $ _POST ['Model'] ['attribute'];)没有做出这样的检查 - Yii假设   归属是可信的。

那么,任何人都可以证明哪个是正确的?

2 个答案:

答案 0 :(得分:6)

只有在具有验证规则且其类型不“不安全”的情况下,才可以大量分配字段。但是,在大规模分配时,它没有得到验证。

当您调用validate()或调用save(true)时,它会被验证。

不要忘记您可以直接在他们的班级参考

中阅读Yii源代码

答案 1 :(得分:0)

在两种情况下发生大规模分配 - 1.为字段设置验证规则时。在这种情况下,该字段将通过验证。 2.当您声明该字段是安全的时。在这种情况下,您可能有也可能没有字段的验证规则。任务将无关紧要。

所以正确的答案是 - '取决于'你是否有为该字段定义的验证规则。