我第一次在我負責維護的遺留應用程式中同時使用 Laravel (5.4) 和 PHP,在過去的幾個月里,我注意到了一個痛點,那就是批量分配。
我相信我對是什么有足夠的了解,但我不確定我是否真的正確地使用了它。官方檔案使用用戶角色的(好的,但極端的)示例說明了該問題。我理解這一點的重要性以及為什么我應該保護這些變數。但是,我認為我對確定要保護或不保護哪些欄位(如果有的話)并沒有真正的了解。
似乎 Laravel 的許多不錯的功能似乎都沒有考慮批量賦值,這是我沮喪的主要來源。例如,如果我的端點有一些可選欄位(即您不能在請求中指定它們),那么執行 amymodel->update(request->all())只會更新您提供的欄位。如果許多欄位受到保護,如果我想實作相同的行為,我將不得不進行多次重復的 isset() 檢查,這似乎是不必要的。我也知道不request->all()應該這樣使用,但我只是想說明一點。
當您考慮可能要使用強大的驗證以及request->only([...])確保您的資料正確并僅過濾到您期望的內容時,它會變得更加麻煩。
所以最終我要問的是:
在存在強大的驗證和輸入整形方法的情況下,大規模分配幾乎任何事情仍然值得做嗎?總的來說,當我的驗證步驟似乎已經解決了問題時,我似乎無緣無故地跳過了更多的障礙。如果它仍然值得做,我錯過了什么?是否應該只將批量分配保護委托給非常重要的領域,比如用戶的角色,而別無其他?
uj5u.com熱心網友回復:
其實我沒明白你這句話的意思:
如果許多欄位受到保護,如果我想實作相同的行為,我將不得不進行多次重復的 isset() 檢查
不是可批量分配的欄位,只是在請求中出現時被丟棄
但在方案中,當用戶傳遞引數就像forbidden_param從請求,forbidden_param是不是大規模分配(無論是不是在fillables或者是受保護)就沒有拋出錯誤,雄辯是要放棄的forbidden_param。
如果你的代碼中有這個:
if(isset($request->forbidden_param))
使用可分配的質量時,您可以從它們中解脫出來。
Laravel 讓你可以隨心所欲地完成作業
Laravel 只是不強迫您使用helpers或Facade或DI ……來使用服務。
為了保護模型欄位,您可以使用不同的解決方案來:
1.Eloquent 保護(Mass Assignable)
您可以從請求中傳遞引數,然后保護它們免受雄辯。
//in controller
MyModel::update($request->input())
// in model
$fillable = [ ... ]
//or
$guarded = [ ... ]
這是一種常見的模式,我已經看到很多使用這種場景的代碼。
好處是:
- 傾斜控制器
- 如果您只是忘記控制其他地方的輸入(控制器/驗證),請不要擔心容易出錯的欄位
2.控制器保護
我見過的另一種模式是在update方法中放置確切的引數,在控制器中。
Model::update([
'permitted_param1' => $request->permitted_param
'permitted_param2' => $request->permitted_param2
]);
在這種情況下,可以通過以下方式放松模型中可分配的質量:
$guarded = [];
或者可以從中受益,以防萬一另一個控制器上的另一個隊友可能忘記控制輸入和使用$request->input()。雖然這將是可選的。
這樣做的好處:
- 能夠擁有不同的輸入名稱和資料庫欄位名稱
- 能夠在輸入模型之前操作輸入(可以使用 mutators 或 repository 實作)。但是如果要更改的欄位很少,則實作起來更簡單。
在下面的示例中,控制器使用混合方法:
User::create($request->except('password') [ 'secret' => bcrypt($request->password)] );
3.在驗證器中保護
我見過的最有前途的方法之一是僅使用經過驗證的資料,如下所示:對于 Laravel 8 :
MyModel::update($request->safe()->all());
對于 8 之前的 Laravel:
MyModel::update($request->validated())
你可以放松可分配的質量
好處:
- 您已將驗證和敏感資料合并到一個地方
- 更精簡的控制器
- 您確定您已驗證所有資料
注意:在可選資料的情況下,您可以不放置
required規則
4.存盤庫模式
另一種方法是使用存盤庫模式,它可以為小型專案引入復雜性。
但結果是:
- 更精簡的控制器和模型
- 在存盤庫中移動查詢邏輯
- 使查詢更可重用和解耦
對于使用此設計模式的專案,此控制元件可以移至存盤庫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/361733.html
