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