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