10.Laravel5学习笔记:Laravel中的批量赋值探索
在使用laravel的 seed
功能的时候,经常有同学会看到以下这个异常
[IlluminateDatabaseEloquentMassAssignmentException]
username
这个异常是什么呢?意思就是,使用MODEL::create()这个方法的时候,Laravel为了保证系统的安全,防止有人恶意通过http请求来直接将某些字段创建时插入到数据库,造成破坏。
引用官网的原话
A mass-assignment vulnerability occurs when user’s pass unexpected HTTP parameters through a request, and then that parameter changes a column in your database you did not expect. For example, a malicious user might send an is_admin parameter through an HTTP request, which is then mapped onto your model’s create method, allowing the user to escalate themselves to an administrator.
首先假设我们的 Seeder
是这样的
public function run()
{
DB::table("addresss")->delete();
Address::create([
"user_id" => 1,
"identity" => 1,
"longlat" => "XXXXX",
"province" => "XXX",
"city" => "XXX",
"district" => "XXX",
"detail" => "XXXX",
]);
}
此时如果 Address
这个model没有设置 fillable
或者 guarded
两个属性,而直接使用
php artisan db:seed --class="AddressTableSeeder"
的话,就会报上面的错误。假设在 Address
中设置了 fillable
protected $fillable = ["user_id", "identity", ];
此时如果执行 seed
命令,数据库中新增加的数据只会有 user_id
与 identity
这两个字段。
通过以上这个过程可以明确了解到批量赋值的深意了吧。所以想要在创建的时候完成所有数据的插入,应该将所有的字段均设置到 fillable
中去。
偶尔也会遇到一张表中的字段太多了,有同学说一个个写到 fillable
中是不是太蛋碎了呀。Laravel这款号称史上最优雅的框架,怎么可能没有考虑到这个事情呢。所有还有一个 guarded
这个属性供你使用嘛。字段太多的时候,你把需要禁止批量赋值的字段设置到它里边就好了。
学海无涯呀!继续加油推进,最近开始使用laravel在做app的后端服务了。已经分享了一些自己结合第三方SDK改造的工具。
- 百度消息推送 Laravel composer包
- 自动生成API接口文档 Laravel composer包
- 百度富文本工具 Laravel composer包
Laravel5专题目录