unguard / reguard 这二个方法怎么理解?
Model::unguard();
$this->call(UsersTableSeeder::class);
Model::reguard();
简单来说,是临时取消批量赋值(mass assignment)保护,因为此时可能需要批量对is_admin等敏感属性进行赋值,而为了安全这是不允许的。
我尝试来总结一下这个问题:
laravel文档中经常会提到mass assignment,我简单翻译为批量赋值,其实质是为了防止用户恶意注入数据,保护数据的安全。
举例来说,你的用户表有users里有is_admin属性,标识该用户是否为管理员,正常情况下你当然不希望用户自己设置此属性。但如果你包含了如下代码:
则用户可能恶意构造数据,同时提交了name、password、is_admin等字段,从而将自己设置为管理员,这就带来了安全问题。
于是,laravel提供了两种解决方案。
其一:即设置fillable属性,列入针对上述问题,设置
此时即使用户提交了is_admin属性也会被忽略。那么我们如何才能设置此属性呢?单独赋值,即
这种方式教程里面也有涉及。
其二:设置guarded属性
注意,guarded属性是仅保护这个属性,其余所有属性均可批量赋值,与fillable刚好相反,两种方式任选一种即可
laravel参考文档:mass assignment
至此,为什么要unguard然后guard应该就十分清楚了,从方法名很容易就看出来。
为了批量填充数据,当然要暂时性关闭安全保护,填充完毕后重新打开保护。
当然,此处还有一点问题,就是我在laravel文档里并没有搜到这两个方法。。。。
如果你看到了欢迎补充链接