1. 程式人生 > 程式設計 >Laravel異常上下文解決方案分享

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

目錄
  • 前言
  • 開始改造
  • 優化實現
  • 邏輯複用
  • 總結

前言

異常時我們通常希望在使用者側給一個友好的提示,但預設使用框架的異常處理方案是不 OK 的。

最近專案遇到一個情況,我們在遇到使用者訪問某個資訊沒有許可權的時候,希望提示詳細的原因,比如當訪問一個團隊資源時非成員訪問的場景下會提示一個:您不是 [xxxxxx] 團隊的成員,暫時無法檢視,可<申請加入>,同時需要顯示打碼後的團隊名稱,以及加入按鈕,可是介面方的邏輯是當沒有許可權時直接abort&nbshttp://www.cppcns.comp;了:

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

得到的響應結果如下:

HTTP/1.0 403 Forbidden

{
	"message": "您無權訪問該資源"
}

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

HTTP/1.0 403 Forbidden

{
	"message": "您無權訪問該資源","team": {
		"id": "abxT8sioa0Ms","name": "CoDesign****"
	}
}

通過攜帶上下文的方法傳遞資料,方便了前端同學自由組合。

開始改造

當然這並不是什麼複雜的事情,直接修改原來的abort_if即可解決:

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

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

優化實現

看了abort原始碼,我發現它的第一個引數其實支援\Symfony\Component\HttpFoundation\Response例項,而上面