第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

RESTful API 基于用戶角色的不同響應

RESTful API 基于用戶角色的不同響應

PHP
大話西游666 2021-09-18 10:22:17
我使用 Laravel 作為我的 PHP 框架。它是將index show store ...函數(shù)放入控制器的約定。我有兩種類型的用戶(管理員和普通用戶)。讓我們假設(shè)有一個Order(在餐廳)模型,我想index為其控制器實現(xiàn)功能。一個用戶可以有多個訂單。我需要的是這個功能:如果管理員正在調(diào)用此 API:返回所有訂單如果普通用戶正在調(diào)用此 API:僅返回此用戶擁有的訂單我搜索過,但找不到任何東西(tbh 我不知道要搜索什么)。一旦我按照以下方式執(zhí)行此操作,我不喜歡它,因為它看起來兩個不同的功能合二為一:if ($user->role == admin) {       // fetch all orders   } else if ($user->role == normal_user) {       // just find user orders     }所以我的問題是實現(xiàn)我想要的最佳方法是什么?
查看完整描述

3 回答

?
撒科打諢

TA貢獻1934條經(jīng)驗 獲得超2個贊

這樣的 REST API 端點通常是允許多個過濾器、排序和分頁的搜索。如果是這樣,完全可以為過濾器應用不同的默認值并將過濾器限制為角色。

如果沒有管理員角色的用戶嘗試為不同的用戶應用用戶過濾器,我會自動應用過濾器 user=currentUser 來丟失管理員角色并返回禁止。

通過這種方法,您還可以為管理員提供搜索特定用戶的報價的功能,并且您只需要一個搜索 api 即可供控制器使用。


查看完整回答
反對 回復 2021-09-18
?
BIG陽

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控制器。


因為您可能還需要更新和刪除,或其他只能由管理員訪問的功能


查看完整回答
反對 回復 2021-09-18
?
胡說叔叔

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)的總體思路。


查看完整回答
反對 回復 2021-09-18
  • 3 回答
  • 0 關(guān)注
  • 147 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號