欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Laravel異常上下文解決方案

這篇文章主要介紹了Laravel異常上下文解決方案,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括潞城網(wǎng)站建設(shè)、潞城網(wǎng)站制作、潞城網(wǎng)頁制作以及潞城網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,潞城網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到潞城省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

最近項(xiàng)目遇到一個(gè)情況,我們在遇到用戶訪問某個(gè)信息沒有權(quán)限的時(shí)候,希望提示詳細(xì)的原因,比如當(dāng)訪問一個(gè)團(tuán)隊(duì)資源時(shí)非成員訪問的場景下會(huì)提示一個(gè):您不是 [xxxxxx] 團(tuán)隊(duì)的成員,暫時(shí)無法查看,可<申請加入>,同時(shí)需要顯示打碼后的團(tuán)隊(duì)名稱,以及加入按鈕,可是接口方的邏輯是當(dāng)沒有權(quán)限時(shí)直接 abort 了:

abort_if(!$user->isMember($resouce->team), 403, '您無權(quán)訪問該資源');

得到的響應(yīng)結(jié)果如下:

HTTP/1.0 403 Forbidden{
    "message": "您無權(quán)訪問該資源"}

我們不可能將 message 用 html 來完成前端提示頁的展示,這樣耦合性太強(qiáng),違背了前后端分離的原則。我們的目標(biāo)是返回如下的格式即可解決:

HTTP/1.0 403 Forbidden{
    "message": "您無權(quán)訪問該資源",
    "team": {
        "id": "abxT8sioa0Ms",
        "name": "CoDesign****"
    }}

通過攜帶上下文的方法傳遞數(shù)據(jù),方便了前端同學(xué)自由組合。

開始改造

當(dāng)然這并不是什么復(fù)雜的事情,直接修改原來的 abort_if 即可解決:

- abort_if(!$user->isMember($resouce->team), 403, '您無權(quán)訪問該資源');
+ if (!$user->isMember($resouce->team)) {
+    return response()->json([
+        'message' => '您無權(quán)訪問該資源',
+        'team' => [
+            'id' => $resouce->team_id,
+            'name'=> $resouce->team->desensitised_name,
+        ]
+    ], 403);
+ }

這樣看起來解決了問題,可是試想一下,如果是在閉包里面檢測到異常想要退出,上面這種 return 式的寫法就會(huì)比較難搞了,畢竟 return 只會(huì)終止最近的上下文環(huán)境,我們還是希望像 abort 一樣能終止整個(gè)應(yīng)用的執(zhí)行,再進(jìn)行另一番改造。

優(yōu)化實(shí)現(xiàn)

看了 abort 源碼,我發(fā)現(xiàn)它的第一個(gè)參數(shù)其實(shí)支持 \Symfony\Component\HttpFoundation\Response 實(shí)例,而上面我們 return 的結(jié)果就是它的實(shí)例,所以我們只需要改成這樣就可以了:

 if (!$user->isMember($resouce->team)) {
    abort(response()->json([
        'message' => '您無權(quán)訪問該資源',
        'team' => [
            'id' => $resouce->team_id,
            'name'=> $resouce->team->desensitised_name,
        ]
    ], 403));
 }

看起來實(shí)現(xiàn)了異常中斷,可是新的問題來了,如果需要復(fù)用的時(shí)候還是比較尷尬,這段代碼將會(huì)重復(fù)出現(xiàn)在各種有此權(quán)限判斷的地方,這并不是我們想要的。

邏輯復(fù)用

為了達(dá)到邏輯復(fù)用,看了 \App\Exceptions\Handler 的實(shí)現(xiàn),發(fā)現(xiàn)父類的 render 方法還有這么一個(gè)設(shè)計(jì):

public function render($request, Throwable $e)
{
    if (method_exists($e, 'render') && $response = $e->render($request)) {
        return Router::toResponse($request, $response);
    } elseif ($e instanceof Responsable) {
        return $e->toResponse($request);
    }
    //...

所以,我們可以將這個(gè)邏輯抽離為一個(gè)獨(dú)立的異常類,實(shí)現(xiàn) render 方法即可:

我們先創(chuàng)建一個(gè)異常類:

$ ./artisan make:exception NotTeamMemberException

實(shí)現(xiàn)代碼如下:

<?php
namespace App\Exceptions;
use App\Team;
class NotTeamMemberException extends \Exception
{
    public Team $team;
    public function __construct(Team $team, $message = "")
    {
        $this->team = $team;
        parent::__construct($message, 403);
    }
    public function render()
    {
        return response()->json(
            [
                'message' => !empty($this->message) ? $this->message : '您無權(quán)訪問該資源',
                'team' => [
                    'id' => $this->team->id,
                    'name' => $this->team->desensitised_name,
                ],
            ],
            403
        );
    }
}

這樣一來,我們的邏輯就變成了:

if (!$user->isMember($resouce->team)) {
     throw new NotTeamMemberException($resouce->team, '您無權(quán)訪問該資源');
}

當(dāng)然也可以簡寫為:

\throw_if(!$user->isMember($resouce->team), NotTeamMemberException::class, $resouce->team, '您無權(quán)訪問該資源');

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Laravel異常上下文解決方案”這篇文章對大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

當(dāng)前題目:Laravel異常上下文解決方案
標(biāo)題鏈接:http://aaarwkj.com/article8/igihip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)服務(wù)器托管、關(guān)鍵詞優(yōu)化網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站策劃、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
一级片欧美女人性生活片| 日韩亚洲毛片全在线播放| 日韩精品视频性色首页| 色综合久久国产原创野外| 蜜臀99久久精品久久久| 91麻豆精品国产久久久| 国产在线一区二区三区观看| 羞羞的视频免费观看在线| 欧美日韩福利一区二区三区| 国产操大奶头女人自拍av| 亚洲最大色网在线观看| 欧美日韩精品激情一区二区| 午夜av一区二区三区| 99精品国产一区二区青青性色| 深夜视频国产在线观看| 午夜福利中文在线观看| 成人又黄又爽大片在线观看| 不卡一区二区三区av电影| 97视频在线中文字幕| 日本写真视频一区二区三区| 大龄熟妇丰满有水多毛浓| 麻豆国产原创av色哟哟| 麻豆午夜视频免费在线观看| 亚洲天堂欧美日韩一区| 91久久国产综合精品女同| 亚洲综合欧美日韩一区| 自拍偷拍亚洲丝袜大秀| 日韩不卡免费在线视频| 亚洲熟女av综合网丁香| 中文字幕不卡一区在线| 欧美日韩一级一区二区| 乱色精品熟女一区二区三区| 亚洲国产日韩在线精品| 国产精品欧美色区福利在线| 亚洲国产精品有码专区| 熟妇人妻精品视频一区二区| 久久久久久亚洲精品人妻| 高清免费国产日日操夜夜草| 日韩天堂视频在线播放| 亚洲老熟女老妇老女人| 欧美亚日韩精品视频|