3 回答

TA貢獻1934條經(jīng)驗 獲得超2個贊
這樣的 REST API 端點通常是允許多個過濾器、排序和分頁的搜索。如果是這樣,完全可以為過濾器應用不同的默認值并將過濾器限制為角色。
如果沒有管理員角色的用戶嘗試為不同的用戶應用用戶過濾器,我會自動應用過濾器 user=currentUser 來丟失管理員角色并返回禁止。
通過這種方法,您還可以為管理員提供搜索特定用戶的報價的功能,并且您只需要一個搜索 api 即可供控制器使用。

TA貢獻1859條經(jīng)驗 獲得超6個贊
為什么不使用 if 語句?
你可以在模型上制作一個范圍,但你仍然會有一個 if。
那這個呢?
if ($user->role == admin) {
Order::all();
} else if ($user->role == normal_user) {
$user->orders()->get();
}
或者使它成為內(nèi)聯(lián)如果
$user->role == admin ? Order::all() : $user->orders()->get();
IMO 這里的最佳實踐是創(chuàng)建一個不同的 Admin/OrderController.php
然后用中間件檢查wat,用戶的角色是,然后將他們重定向到admin控制器。
因為您可能還需要更新和刪除,或其他只能由管理員訪問的功能

TA貢獻1804條經(jīng)驗 獲得超8個贊
不久前我自己也有一個類似的問題,最終得到了這個奇怪的解決方案來避免 if/else 塊。
假設(shè)
我假設(shè) User 模型中存在一個輔助方法,isNot($role)用于驗證用戶的角色是否與給定的角色匹配。這只是給出檢查想法的示例,但您應該根據(jù)需要實施條件。
我所做的第二個假設(shè)是每個訂單都有一個user_id字段,該字段將通過他的 ID(用戶和訂單之間的 FK 1:N)引用該訂單的所有者。
執(zhí)行
public function index(Request $request)
{
$orders = Order::query()
->when($request->user()->isNot('admin'), function ($query) use ($request) {
return $request->user()->orders();
// Or return $query->where('user_id', $request->user()->id);
})
->paginate();
return OrderResource::collection($orders);
}
該when方法是這里的關(guān)鍵?;旧夏惴Q之為:when($value, $callback)如果$value是false回調(diào)將不會被執(zhí)行,否則它會。
因此,例如,如果用戶不是管理員,您最終將執(zhí)行此查詢: Order::paginate(); 這將使用分頁獲取所有訂單(請注意,您可以paginate與get.
否則,將執(zhí)行回調(diào)并且您將執(zhí)行該paginate方法$request->user()->orders();(像方法一樣調(diào)用的訂單仍然是查詢構(gòu)建器對象,因此您可以對其調(diào)用 paginate)。查詢將是: $request->user()->orders()->paginate();
如果您在回調(diào)中選擇了第二種解決方案,您基本上會向主范圍添加一個 where 條件(過濾訂單的 user_id)以僅獲取用戶的訂單。查詢將是: Order::query()->where('user_id', $request->user()->id)->paginate();
最后,為了更好地控制作為響應發(fā)回的內(nèi)容,我使用了Laravel 的 API 資源(如果您需要自定義響應,我真的建議您也這樣做)。
注意:代碼可能有語法和/或邏輯錯誤,因為它只是對生產(chǎn)代碼的即時編輯,并且還沒有經(jīng)過測試,但它應該給出正確實現(xiàn)的總體思路。
- 3 回答
- 0 關(guān)注
- 147 瀏覽
添加回答
舉報