刘师傅
- 刘师傅 2019-01-17 已签到连续签到32天,获得了20个金钱
- 刘师傅 2019-01-16 已签到连续签到31天,获得了20个金钱
看了楼主的文章也是深感共鸣,感觉有所收获。
但是仔细看了下文档结合自己的代码输出,觉得这个里面的内容还是有出入的。首先,引用非安全属性的部分原话
你可能想验证一个属性但不想让他是安全的, 可在scenarios()方法中属性名加一个惊叹号 !
是想【验证】属性,但是不想让他安全。他想说的是验证,也就是说这个属性可能被自己直接赋值了
$model->contact_name = 'xxx'; // 为前提,才能让你此次的load通过,没有想到具体场景,假设场景就是你必须验证你的姓名是否为真(假设验证之后你的contact_name 才能赋值),然后load才能通过
其次,safe验证
safe验证器和不写还是大有区别的,不写在前台load的时候就不会被load上,而safe验证器是指的前台可以load随意任何值都可以,但是感觉很不安全是的。
不知道理解是否正确,帖子也有段时间了,挖出来也是想着更多的讨论。
敬礼。首先这个话题我以为石沉大海了,其实应该有好多人看了但是并没有提出问题。互相学习下还是好的,尤其遇到了理解不一致的东西。
我还是拆成两个部分来理解:
第一,首先理解“安全属性”和load的关系。
“安全属性”这个概念的意思,就是说可以在对应场景下被load赋值的属性。这个在文档第一句话就说了:块赋值只应用在模型当前scenario 场景yii\base\Model::scenarios()方法 列出的称之为 安全属性 的属性上
块赋值就是指load()方法赋值。被赋值的属性就是安全属性。
你说的那个“想验证一个属性而又不想它是安全的”。我觉得你说得是对的。没有问题。对某些安全属性前缀加上"!"号后它就不会在load时被赋值了,它就是“非安全属性”了。当然你应该在这之前或之后用其它方法赋值。第二个:对于safe验证器的理解来说,我还是坚持我的看法,
safe验证器写与不写都不影响load()过程。safe紧紧是声明了不验证的属性而已。这些属性可以是load赋值的,或者直接赋值的都无所谓。
文档上有一段话是这么翻译的,但是我觉得有理解歧义:
为此,提供一个特别的别名为 safe 的验证器来申明 哪些属性是安全的不需要被验证, 如下示例的规则申明 title 和 description 都为安全属性。
上面说
“哪些属性是安全的不需要被验证”
我觉得“不需要被验证”说对了,因为safe验证器就是一个傀儡验证器,没有验证过程。
但是“哪些属性是安全的”
这部分。这里的“安全”,我觉得应该不是前面所说的“安全属性”里的“安全”。这里的“安全”就是我们所说的,主观上认为这些属性没有问题,没有漏洞,可以不走,也不需要走验证过程,“很安全”。所以这里和load()没有关系。
再回到第一句文章的原话:
你可能想验证一个属性但不想让他是安全的, 可在scenarios()方法中属性名加一个惊叹号 !
我觉得把这句话包含了load()和验证两个过程,把它俩加一块理解就可以了:
“想验证一个属性”,说的是后面的rules里的规则验证过程;
“不想让他是安全的”是说不希望被load()赋值。
就这样理解。你觉得咋样?我觉得很有意思。- 刘师傅 2019-01-15 已签到连续签到30天,获得了20个金钱
- 刘师傅 2019-01-13 已签到连续签到28天,获得了20个金钱
- 刘师傅 2019-01-14 已签到连续签到29天,获得了20个金钱
- 刘师傅 2019-01-11 已签到连续签到26天,获得了20个金钱
- 刘师傅 2019-01-12 已签到连续签到27天,获得了20个金钱
asArray()->all()好像还是不太完美,因为涉及连接表的字段的话,就会以数组下标形式存在
比如主表是A,某些信息需要连接表B来查,那么代码类似这样:$retArr = A::find()->select(['A.name','A.age','B.school'])->joinWith('B')->filterWhere(['dddd'=>[$a,$b])->asArray()->all();
这样的数组$retArr信息除了'name','age','school'之外,还有一个'B'为下标的子数组,这个数组就是多余的
太棒了,一直没有关注这个参数。一语中的!
- 刘师傅 2019-01-10 已签到连续签到25天,获得了20个金钱