Safe Attributes 疑问?

刚刚用yii来进行开发, 对safe attributes有点疑问:

  1. 是否在验证rules里面对某个attributes定义了多个场景的验证规则, 该attribute就是safe的了?

2)在model里面有定义safe attribues array的地方, 这个可否认为是为无验证规则的attribue的重新定义为safe的地方? 因为如果上面那条已经成立, 这里已经没有必要再重复定义, 难道是为了代码可读性考虑?

3)我在阅读yiiblognew的代码时, 看了其在注册的action里面, 在验证之后,model save之前, 调用了$model->password=md5($model->password); 我也在我的代码中如法炮制, 但是model save却出错,但是我在beforeSave里面做, model save成功. 这个是否说明safe attribue在某种场合(这里是注册的action, 并且pasword在注册和登录的场景下都有验证rule,所以应该是safe的attribute)下不能用内部值进行赋值, 而在beforeSave的时候却是可以的, 或句话说, 在某个场合下是会检查是用户输入的值还是内部产生的值? 如果有这个场合的约束, 那这个场合是什么?

刚刚用yii,如果有理解不对的地方, 也请大家指出, 谢谢!

safe attributes指的是由用户输入的、需要验证的属性。如果一个属性出现在一个验证规则里,并且该验证规则的适用scenario和model当前的scenario一致,那么该属性就是safe的,可以接受批量赋值。

在yii 1.1里,safeAttributes()函数已经取消了。所有的属性都通过验证规则来声明是否safe。

save()函数会调用validate()。所以你在程序里更改password后可能造成save()时验证出错(比如password和password_repeat不匹配)。beforeSave()发生在validate()之后,所以没问题。具体请参看:http://www.yiiframework.com/doc/guide/database.ar#customization

谢谢强哥的回复, 我去好好学习一下。