最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Laravel異常上下文解決方案分享

 更新時(shí)間:2022年01月06日 16:14:46   作者:overtrue  
異常處理是編程中十分重要但也最容易被人忽視的語(yǔ)言特性,下面這篇文章主要給大家介紹了關(guān)于Laravel異常上下文解決方案的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

異常時(shí)我們通常希望在用戶(hù)側(cè)給一個(gè)友好的提示,但默認(rèn)使用框架的異常處理方案是不 OK 的。

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

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

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

HTTP/1.0 403 Forbidden

{
	"message": "您無(wú)權(quán)訪問(wèn)該資源"
}

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

HTTP/1.0 403 Forbidden

{
	"message": "您無(wú)權(quán)訪問(wèn)該資源",
	"team": {
		"id": "abxT8sioa0Ms",
		"name": "CoDesign****"
	}
}

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

開(kāi)始改造

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

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

這樣看起來(lái)解決了問(wèn)題,可是試想一下,如果是在閉包里面檢測(cè)到異常想要退出,上面這種 return 式的寫(xiě)法就會(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' => '您無(wú)權(quán)訪問(wèn)該資源',
		'team' => [
			'id' => $resouce->team_id,
			'name'=> $resouce->team->desensitised_name,
		]
	], 403));
 }

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

邏輯復(fù)用

為了達(dá)到邏輯復(fù)用,我認(rèn)證看了 \App\Exceptions\Handler 的實(shí)現(xiàn),發(fā)現(xiàn)父類(lèi)的 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ú)立的異常類(lèi),實(shí)現(xiàn) render 方法即可:

$ ./artisan make:exception NotTeamMemberException

代碼如下:

<?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 : '您無(wú)權(quán)訪問(wèn)該資源',
                'team' => [
                    'id' => $this->team->id,
                    'name' => $this->team->desensitised_name,
                ],
            ],
            403
        );
    }
}

這樣一來(lái),我們的邏輯就變成了:

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

當(dāng)然也可以簡(jiǎn)化為:

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

問(wèn)題到這里總算以一個(gè)比較完美的方式解決了,如果你有更好的方案歡迎評(píng)論探討。

總結(jié)

到此這篇關(guān)于Laravel異常上下文解決方案的文章就介紹到這了,更多相關(guān)Laravel異常上下文解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PhpStorm 如何優(yōu)雅的調(diào)試Hyperf的方法步驟

    PhpStorm 如何優(yōu)雅的調(diào)試Hyperf的方法步驟

    這篇文章主要介紹了PhpStorm 如何優(yōu)雅的調(diào)試Hyperf的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • ThinkPHP的Widget擴(kuò)展實(shí)例

    ThinkPHP的Widget擴(kuò)展實(shí)例

    這篇文章主要介紹了ThinkPHP的Widget擴(kuò)展 ,需要的朋友可以參考下
    2014-06-06
  • Laravel中前端js上傳圖片到七牛云的示例代碼

    Laravel中前端js上傳圖片到七牛云的示例代碼

    本篇文章主要介紹了Laravel中前端js上傳圖片到七牛云的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-09-09
  • php實(shí)現(xiàn)在站點(diǎn)里面添加郵件發(fā)送的功能

    php實(shí)現(xiàn)在站點(diǎn)里面添加郵件發(fā)送的功能

    開(kāi)發(fā)了一個(gè)簡(jiǎn)單的空間管理系統(tǒng),將所有的域名空間保存到數(shù)據(jù)庫(kù)里面進(jìn)行管理,在用戶(hù)進(jìn)行續(xù)費(fèi)的時(shí)候就進(jìn)行發(fā)送一個(gè)郵件來(lái)進(jìn)行通知,然后我這邊進(jìn)行續(xù)費(fèi)操作,正好用到一個(gè)郵件發(fā)送的功能,那如何實(shí)現(xiàn)郵件發(fā)送的功能
    2016-04-04
  • PHP Smarty生成EXCEL文檔的代碼

    PHP Smarty生成EXCEL文檔的代碼

    PHP結(jié)合Smarty產(chǎn)生EXCEL文檔 1,首先在EXCEL (office 2003)里生成一個(gè)模板,然后存成 xml表格。 2,修改這個(gè) xml 文件,做成 smarty 的模板。 3,然后,就是 綁定變量,輸出就行了。
    2008-08-08
  • PHP中為什么使用file_get_contents("php://input")接收微信通知

    PHP中為什么使用file_get_contents("php://input")接收微信通知

    微信用戶(hù)和公眾號(hào)產(chǎn)生交互的過(guò)程中,用戶(hù)的某些操作會(huì)使得微信服務(wù)器事件推送,通知到開(kāi)發(fā)者中心設(shè)置的服務(wù)器地址(回調(diào)url),開(kāi)發(fā)者可以獲取到該信息。PHP中為什么使用file_get_contents("php://input")來(lái)接收呢?為什么有些場(chǎng)景php://input接收不到?
    2023-07-07
  • thinkPHP5.0框架應(yīng)用請(qǐng)求生命周期分析

    thinkPHP5.0框架應(yīng)用請(qǐng)求生命周期分析

    這篇文章主要介紹了thinkPHP5.0框架應(yīng)用請(qǐng)求生命周期,較為詳細(xì)的分析了thinkPHP5.0框架應(yīng)用請(qǐng)求生命周期所涉及的各個(gè)執(zhí)行流程,需要的朋友可以參考下
    2017-03-03
  • php版微信開(kāi)發(fā)之接收消息,自動(dòng)判斷及回復(fù)相應(yīng)消息的方法

    php版微信開(kāi)發(fā)之接收消息,自動(dòng)判斷及回復(fù)相應(yīng)消息的方法

    這篇文章主要介紹了php版微信開(kāi)發(fā)之接收消息,自動(dòng)判斷及回復(fù)相應(yīng)消息的方法,涉及基于微信消息處理接口的調(diào)用相關(guān)操作技巧,需要的朋友可以參考下
    2016-09-09
  • ajax在joomla中的原生態(tài)應(yīng)用代碼

    ajax在joomla中的原生態(tài)應(yīng)用代碼

    一般很少看到j(luò)oomla中使用ajax,筆者以前說(shuō)到過(guò)用jquery來(lái)實(shí)現(xiàn),對(duì)于那些驗(yàn)證用戶(hù)名不能重復(fù),郵箱不能重復(fù),以及聯(lián)動(dòng)菜單,等等的應(yīng)用,使用ajax是免不了的
    2012-07-07
  • thinkPHP事務(wù)操作簡(jiǎn)單案例分析

    thinkPHP事務(wù)操作簡(jiǎn)單案例分析

    這篇文章主要介紹了thinkPHP事務(wù)操作,結(jié)合簡(jiǎn)單案例形式分析了thinkPHP事務(wù)操作的基本原理與使用方法,需要的朋友可以參考下
    2019-10-10

最新評(píng)論

定结县| 罗甸县| 宝坻区| 汝阳县| 体育| 梁山县| 平湖市| 康保县| 淳化县| 鹤壁市| 礼泉县| 石景山区| 稻城县| 河西区| 南陵县| 鹿邑县| 安康市| 东丰县| 绍兴市| 合川市| 河源市| 五常市| 将乐县| 九台市| 静乐县| 甘泉县| 新郑市| 大宁县| 自贡市| 罗山县| 精河县| 澄江县| 肇庆市| 介休市| 安西县| 武胜县| 土默特左旗| 长春市| 比如县| 营口市| 苍山县|