您好,登錄后才能下訂單哦!
今天小編給大家分享一下laravel的fill方法如何用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
在laravel中,fill方法是一個給Eloquent實例賦值屬性的方法,該方法可以理解為用于過濾前端傳輸過來的與模型中對應的多余字段;當調用該方法時,會先去檢測當前Model的狀態,根據fillable數組的設置,Model會處于不同的狀態。
本文操作環境:Windows10系統、Laravel6版、Dell G3電腦。
fill 方法是一個給 Eloquent 實例賦值屬性的方法,
讓咱們點開 fill 方法先看一看它的源碼:數組
這里筆者所使用的版本為 Laravel 5.5最新版,為了方便閱讀,刪除掉了注釋框架
public function fill(array $attributes) { $totallyGuarded = $this->totallyGuarded(); foreach ($this->fillableFromArray($attributes) as $key => $value) { $key = $this->removeTableFromKey($key); if ($this->isFillable($key)) { $this->setAttribute($key, $value); } elseif ($totallyGuarded) { throw new MassAssignmentException($key); } } return $this; }
首先能夠看到,Laravel 會先去調用一個自身的 totallyGuarded 方法,讓咱們點開這個方法:函數
public function totallyGuarded() { return count($this->getFillable()) == 0 && $this->getGuarded() == ['*']; }
能夠看到這個方法的做用就是去獲取自身的 fillable 與 guarded,而后判斷他們是否都為 不可批量賦值 狀態,最后返回一個布爾值this
// 返回一個 True or False 的布爾值 // 若是未設置 fillable 與 guarded,則會返回 True (注意,在這種狀況下,此 `Model` 是不容許批量賦值任何屬性的哦) // 反之則返回 False $totallyGuarded = $this->totallyGuarded();
Ok,讓咱們回到剛才的 fill 方法繼續往下看設計
接下來是一個 foreach 循環,可是在循環以前,Laravel 對傳入的賦值屬性執行了 fillableFromArray 這個方法,再點進去看一下,code
protected function fillableFromArray(array $attributes) { if (count($this->getFillable()) > 0 && ! static::$unguarded) { return array_intersect_key($attributes, array_flip($this->getFillable())); } return $attributes; }
此方法會檢測你是否在 fillable 數組中定義了值,若是定義了值,則會返回 fillable 與 attributes 相交的值,若是沒有,則返回 attributes 自身事件
而后回到 fill ,在調用 fillableFromArray 對參數進行處理以后,如今返回的值只剩咱們容許批量賦值的屬性了 (若是你定義了)ip
循環第一行,先使用 removeTableFromKey 對參數的 Key 進行處理,刪除鍵中的表名,此方法就不作過多講解,只是一個字符串拆分取值的函數rem
$key = $this->removeTableFromKey($key);
接著往下看,Laravel對將要進行填充的每一個屬性都調用了 isFillable 方法來確保此屬性是能夠被填充的,讓咱們看一看它的源碼:
public function isFillable($key) { if (static::$unguarded) { return true; } if (in_array($key, $this->getFillable())) { return true; } if ($this->isGuarded($key)) { return false; } return empty($this->getFillable()) && ! Str::startsWith($key, '_'); }
能夠看到,在此方法中 Laravel 先判斷了此 Model 是否禁用了守衛 (guarded),若是此 Model 并未啟用守衛,那么直接返回 True
if (static::$unguarded) { return true; }
若是啟用了守衛,那么會判斷一下此屬性是否存在于 fillable 數組中,若是存在,則返回 True,
if (in_array($key, $this->getFillable())) { return true; }
若是此屬性不存在于 fillable 數組中,那么 Laravel 會再次判斷此屬性是否存在于 guarded 數組中,若是存在于此數組中,那么此屬性就不是一個能夠被批量賦值的屬性,那么就會直接返回 False
if ($this->isGuarded($key)) { return false; }
若是以上都不符合,那么 Laravel 在最后會判斷一下自身的 fillable 數組是為空而且此屬性是以 _ 開頭,而后返回一個布爾值
return empty($this->getFillable()) && ! Str::startsWith($key, '_');
而后回到 fill 方法接著看,若是此屬性經過了 isFillable 方法的過濾,那么將此屬性賦值給自身 (由于時間有限,setAttribute 這個方法就不細講啦~),
$this->setAttribute($key, $value);
若是沒有經過 isFillable 方法的過濾,那么 Laravel 會判斷一下自身 Model 是否處于不限制任何屬性批量賦值的狀態,若是不是,那么 Laravel 會直接拋出一個 Exception
// 判斷此屬性是否經過了檢測 if ($this->isFillable($key)) { // 將此屬性賦值給自身 $this->setAttribute($key, $value); // 若是沒有經過檢測,那么判斷一下自身 `Model` 是否為所有不可批量賦值狀態,若是是,那么會拋出一個 `Exception` } elseif ($totallyGuarded) { throw new MassAssignmentException($key); }
在對全部的屬性進行檢測而且賦值后, Laravel 會將自身返回
return $this;
解析完畢,以上就是 fill 方法的源碼啦~,最后來一個小結
在你調用 fill 方法的時候,Laravel 首先就會去檢測當前 Model 的狀態,
當你設置了 fillable 數組,沒有設置 guarded 數組時,那么此 Model 會處于 僅可批量賦值指定屬性 的狀態
當你沒有設置 fillable 數組,卻設置了 guarded 數組時,那么此 Model 會處于 可批量賦值任何屬性 的狀態
至于你同時設置了 fillable 與 guarded 數組的狀況就不去討論了,由于這樣作自己就是被 Laravel 所禁止的
而后調用 fillableFromArray 去獲取 attributes 與 fillable 數組的交集,若是你沒有定義 fillable 或者禁用掉了守衛,那么此方法會直接返回 attributes
而后 Laravel 會對返回的數組作一個循環,在這個循環中 Laravel 會對每個屬性調用 isFillable 方法檢測這個屬性是否能夠被填充,若是沒有經過此方法的檢測(不存在于fillable 數組中而且沒有設置 guarded 數組或存在于 guarded 數組中),那么 Laravel會檢測當前 Model 是否處于 僅可批量賦值指定屬性 狀態,若是是,那么會直接拋出一個 Exception
而后 Laravel 會返回完成賦值操做后的 $this
以上就是“laravel的fill方法如何用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。