Laravel Mass-Assignment (批量賦值) 的真正含義

初次遇到 批量賦值 的時候,很容易理解成 批量添加多條數據,實際並不是如此。請看下面的例子。php

假設用戶表 users 結構以下,且經過 is_admin 字段值爲 10 來判斷用戶是否爲 管理員,其中 is_admin 字段默認值爲 0laravel

+----+-----------+------------------+----------+--------------------------------------------------------------+
| id | name      | email            | is_admin | password                                                     |
+----+-----------+------------------+----------+--------------------------------------------------------------+
|  1 | seekerliu | me@seekerliu.com |        1 | $2y$10$RL6r.MwoJd.oOvKRYhUpmeQI6hUpoG/KgGNhA6X5JrRqfVbooCs92 |
+----+-----------+------------------+----------+--------------------------------------------------------------+

正常狀況下,咱們經過這種方式新建一個 普通 用戶:git

public function store (Request $request)
{
    $user = new \App\User;
        
    // 賦值
    $user->name = $request->name;
    $user->email = $request->email;
    $user->password = bcrypt($request->password);
        
    // 新建一個用戶
    $user->save();
}

爲了方便,咱們能夠使用 $request->all() 獲取用戶提交的全部表單數據:github

public function store (Request $request)
{
    $user = new \App\User;
        
    // Mass-Assignment 批量賦值
    $data = $request->all();   
        
    // 新建一個用戶
    $user->create($data);
}

這種狀況下,若是用戶提交正確的表單數據,例如: ['name' => 'liu', 'email' => 'liu@seekerliu.com', 'password' => 'test'] ,會新建一個 普通 用戶。
但只要用戶在表單中僞造一個 ['is_admin' => 1] 字段,就能新建一個 管理員 用戶。
這種經過將一大堆數據同時傳遞給模型的 create() 方法來新建一行的方式就是 Mass-Assignment (批量賦值)bash

Laravel 提供了保護 Mass-Assignment 的方法,那就是在模型上定義 fillableguarded 的屬性,例如:code

class User extend Model
{
    protected $fillable = ['name', 'email', 'password'];
}

或:ip

class User extend Model
{
    protected $guarded = ['is_admin'];
}

這樣,在執行 create() 方法時,Eloquent 模型會先使用 fill() 方法對數據進行過濾,去掉 $fillable 之外的字段(白名單),或去掉 $guarded 中的字段(黑名單),來保證只獲取預期的表單字段。get

以上就是 LaravelMass-Assignmentit

原創。 全部 Laravel 文章均已收錄至 laravel-tips 項目。io

相關文章
相關標籤/搜索