日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

设置响应主体格式php,Laravel如何实现适合Api的异常处理响应格式

發(fā)布時間:2025/3/19 php 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设置响应主体格式php,Laravel如何实现适合Api的异常处理响应格式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

Laravel全局捕獲異常后,會把異常轉(zhuǎn)為相應(yīng)的數(shù)據(jù)格式返回給用戶。如果想要規(guī)定的數(shù)據(jù)格式相應(yīng),那我們只需重寫異常捕獲后的處理方法即可。

異常處理流程

Illuminate\Foundation\Exception\Handler 中的 render 方法用來將異常轉(zhuǎn)化為響應(yīng)。

public function render($request, Exception $e)

{

if (method_exists($e, 'render') && $response = $e->render($request)) {

return Router::toResponse($request, $response);

} elseif ($e instanceof Responsable) {

return $e->toResponse($request);

}

$e = $this->prepareException($e);

if ($e instanceof HttpResponseException) {

return $e->getResponse();

} elseif ($e instanceof AuthenticationException) {

return $this->unauthenticated($request, $e);

} elseif ($e instanceof ValidationException) {

return $this->convertValidationExceptionToResponse($e, $request);

}

return $request->expectsJson()

? $this->prepareJsonResponse($request, $e)

: $this->prepareResponse($request, $e);

}

render() 中又調(diào)用了 prepareException() 對部分異常進行預(yù)處理,但并未執(zhí)行轉(zhuǎn)化為響應(yīng)的操作。

ModelNotFoundException 一般在模型查找不到拋出,prepareException() 中它被轉(zhuǎn)為 Symfony 包中NotFoundHttpException,默認狀態(tài)碼404;

AuthorizationException 在 Policy 權(quán)限未通過時拋出,prepareException() 中它被轉(zhuǎn)為 Symfony 包中 AccessDeniedHttpException,默認狀態(tài)碼403;

TokenMismatchException 在 CSRF 驗證未通過時拋出,prepareException() 中它被轉(zhuǎn)為 Symfony 包中 HttpException,給定狀態(tài)碼419;

其他異常直接返回。

protected function prepareException(Exception $e)

{

if ($e instanceof ModelNotFoundException) {

$e = new NotFoundHttpException($e->getMessage(), $e);

} elseif ($e instanceof AuthorizationException) {

$e = new AccessDeniedHttpException($e->getMessage(), $e);

} elseif ($e instanceof TokenMismatchException) {

$e = new HttpException(419, $e->getMessage(), $e);

}

return $e;

}

在回到 render() ,預(yù)處理異常之后,又分別對 HttpResponseException、AuthenticationException 和 ValidationException 單獨處理,并轉(zhuǎn)為響應(yīng)返回。

除此以外的異常,都在 prepareJsonResponse() 或 prepareResponse() 處理 ,expectsJson() 用來判斷返回 json 響應(yīng)還是普通響應(yīng)。

修改異常響應(yīng)格式

了解了異常處理流程,接下來就處理異常響應(yīng)格式。

修改登錄認證異常格式

由上文可知,AuthenticationException 被捕獲后,調(diào)用 unauthenticated() 來處理。

protected function unauthenticated($request, AuthenticationException $exception)

{

return $request->expectsJson()

? response()->json(['message' => $exception->getMessage()], 401)

: redirect()->guest($exception->redirectTo() ?? route('login'));

}

在 appExceptionsHandler.php 中重寫 unauthenticated() 使其返回我們想要的數(shù)據(jù)格式。

protected function unauthenticated($request, AuthenticationException $exception)

{

return $request->expectsJson()

? response()->json([

'code' => 0,

'data' => $exception->getMessage(),

], 401)

: redirect()->guest($exception->redirectTo() ?? route('login'));

}

修改驗證異常格式

同樣由上文可知,ValidationException 被捕獲后交由 convertValidationExceptionToResponse() 處理,進入此方法后我們需要繼續(xù)追蹤,若是需要 json 響應(yīng),最終交由 invalidJson() 處理。

protected function convertValidationExceptionToResponse(ValidationException $e, $request)

{

if ($e->response) {

return $e->response;

}

return $request->expectsJson()

? $this->invalidJson($request, $e)

: $this->invalid($request, $e);

}

protected function invalidJson($request, ValidationException $exception)

{

return response()->json([

'message' => $exception->getMessage(),

'errors' => $exception->errors(),

], $exception->status);

}

我們繼續(xù)在 appExceptionsHandler.php 重寫 invalidJson() 即可自定義返回格式。

protected function invalidJson($request, ValidationException $exception)

{

return response()->json([

'code' => 0,

'data' => $exception->errors(),

], $exception->status);

}

修改其他異常格式

其他異常是調(diào)用 prepareJsonResponse() 來處理,此方法又調(diào)用 convertExceptionToArray() 來處理響應(yīng)格式。

protected function prepareJsonResponse($request, Exception $e)

{

return new JsonResponse(

$this->convertExceptionToArray($e),

$this->isHttpException($e) ? $e->getStatusCode() : 500,

$this->isHttpException($e) ? $e->getHeaders() : [],

JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES

);

}

protected function convertExceptionToArray(Exception $e)

{

return config('app.debug') ? [

'message' => $e->getMessage(),

'exception' => get_class($e),

'file' => $e->getFile(),

'line' => $e->getLine(),

'trace' => collect($e->getTrace())->map(function ($trace) {

return Arr::except($trace, ['args']);

})->all(),

] : [

'message' => $this->isHttpException($e) ? $e->getMessage() : 'Server Error',

];

}

在 appExceptionsHandler.php 中重寫 convertExceptionToArray() 來自定義其他異常響應(yīng)格式。

protected function convertExceptionToArray(Exception $e)

{

return config('app.debug') ? [

'code' => 0,

'data' => $e->getMessage(),

'exception' => get_class($e),

'file' => $e->getFile(),

'line' => $e->getLine(),

'trace' => collect($e->getTrace())->map(function ($trace) {

return Arr::except($trace, ['args']);

})->all(),

] : [

'code' => 0,

'data' => $this->isHttpException($e) ? $e->getMessage() : 'Server Error',

];

}

強制 json 響應(yīng)

代碼中多次出現(xiàn)了 expectsJson() ,此方法是用來判斷返回 json 響應(yīng)還是普通響應(yīng)。

public function expectsJson()

{

return ($this->ajax() && ! $this->pjax() && $this->acceptsAnyContentType()) || $this->wantsJson();

}

以下兩種條件下,會返回json響應(yīng)。

非XML請求、非pjax并且 Headers 中 Accept 設(shè)置為接收所有格式響應(yīng);

Headers Accept 設(shè)置為 /json、+json。如:Accept:application/json。

除此之外的情況,將不會響應(yīng)json。我們可以利用中間件強制追加 Accept:application/json,使異常響應(yīng)時都返回json。(參考教程 L03 6.0 中提到的方法)

創(chuàng)建中間件 AcceptHeader

namespace App\Http\Middleware;

use Closure;

class AcceptHeader

{

public function handle($request, Closure $next)

{

$request->headers->set('Accept', 'application/json');

return $next($request);

}

}

在 app/Http/Kernel.php 中,將中間件加入路由組即可。

protected $middlewareGroups = [

'web' => [

.

.

.

'api' => [

\App\Http\Middleware\AcceptHeader::class,

'throttle:60,1',

'bindings',

],

];

大功告成。

總結(jié)

到此這篇關(guān)于Laravel如何實現(xiàn)適合Api的異常處理響應(yīng)格式的文章就介紹到這了,更多相關(guān)Laravel適合Api的異常處理響應(yīng)格式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

總結(jié)

以上是生活随笔為你收集整理的设置响应主体格式php,Laravel如何实现适合Api的异常处理响应格式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久福利小视频 | 一区二区三区日韩视频 | 成年人免费网站在线观看 | 欧美一区永久视频免费观看 | 久久午夜视频 | 在线天堂中文 | 91超碰在 | 97人人爽 | 欧美精品激情 | 国产精品久久影视 | 色老头一区二区三区在线观看 | 国产精品久久免费视频 | 嫩草影院在线观看视频 | 一区二区三区在线视频免费观看 | 一二三区免费视频 | 伊人网狼人| 国产中文字幕91 | 中文字幕第一页在线播放 | 91a视频| 日韩欧美中文字幕在线播放 | 色久影院 | 欧美三级影院 | 天天夜夜啦啦啦 | 欧美性www| 在线观看日本一区 | 日韩精品久久一区二区 | 天天搞天天 | 国产一级二级在线观看 | 天天干天天天 | 成人精品在线看 | 欧美精品网址 | 蜜桃av久久久亚洲精品 | av激情在线| 精品无码一区二区三区在线 | 窝窝午夜理论片影院 | 91网在线看 | www.狠狠撸.com| 日韩精品在线观看中文字幕 | 日本a级c片免费看三区 | 亚洲免费观看高清完整版在线 | 骚虎视频最新网址 | 一二三区免费视频 | 2025国产精品视频 | 久久成年人 | 欧美日韩生活片 | 精品一区二区电影 | mm131美女大尺度私密照尤果 | 爱臀av | 狠狠狠狠干| 在线观看欧美亚洲 | 亚洲精品99999 | 国产成人精品无码播放 | 男人亚洲天堂 | 天天综合网久久 | 91污网站 | 亚洲综合日韩精品欧美综合区 | 91久久精品一区二区三 | 欧美国产激情 | wwwxxx在线| 黄色一级片黄色一级片 | 久久天天躁狠狠躁夜夜躁2014 | 国内视频一区 | 天天插天天爽 | 男人天堂欧美 | 尤物视频在线 | 狠狠操狠狠操 | 午夜精品久久久久久久久久久久久蜜桃 | 久久久欧洲 | 人妻一区在线 | 久久久www免费人成人片 | 国产精品久久 | 簧片av| 国产极品91 | а√天堂资源在线 | 69xx欧美| 美女露胸露尿口 | 天天射一射 | 伊人成年网 | 性中国古装videossex | 女教师高潮黄又色视频 | 久久久久夜夜夜精品国产 | 黄色国产一级片 | 丁香久久综合 | 少妇第一次交换又紧又爽 | 最新中文字幕在线播放 | 黄色三级视频在线观看 | 91嫩草欧美久久久九九九 | av永久免费在线观看 | 成人小说亚洲一区二区三区 | 中文字幕精品久久久久人妻红杏ⅰ | 精品人妻一区二区三区四区 | 免费在线观看黄视频 | 香蕉视频在线观看视频 | 欧美日韩精品三区 | 日本一区二区不卡视频 | 久久受 | 午夜国产片 | 天天干天天爽天天射 | 国产精品久久久久久久久免费软件 |