餐饮网站建设优化建站,网站技术支持是什么,王烨飞微博,深圳软件定制公司排名前提
我希望通过中间件记录用户的请求数据、我的返回数据#xff0c;如果出现异常捕获异常。
代码
路由文件#xff1a;追加中间件api-logging#xff0c;用于记录日志
Route::prefix(api)-middleware([api, api-logging])-group(function () {...路由内容
});n…前提
我希望通过中间件记录用户的请求数据、我的返回数据如果出现异常捕获异常。
代码
路由文件追加中间件api-logging用于记录日志
Route::prefix(api)-middleware([api, api-logging])-group(function () {...路由内容
});namespace App\Http;
class Kernel extends HttpKernel
{...其他内容protected $routeMiddleware [... 其他中间件api-logging \App\Http\Middleware\ApiLoggingMiddleware::class,];
}重点中间件的编写
?phpnamespace App\Http\Middleware;use Closure;
use Illuminate\Http\Request;
use App\Models\GameThirdPartyCallback;class ApiLoggingMiddleware
{public function handle(Request $request, Closure $next){$requestHeaders $request-header();$requestData $request-all();$source $request-header(referer) ?? $request-ip();try {// 执行请求并获取响应$response $next($request);$responseStatus $response-status();$responseContent $response-getContent();} catch (\Exception $exception) {// 记录异常信息GameThirdPartyCallback::create([request_headers json_encode($requestHeaders),callback_data json_encode($requestData),response_status 500, // 或其他适当的错误状态码response_content An error occurred: . $exception-getMessage(),sources $source]);// 重新抛出异常交由Laravel处理throw $exception;}// 记录正常的响应数据GameThirdPartyCallback::create([request_headers json_encode($requestHeaders),callback_data json_encode($requestData),response_status $responseStatus,response_content $responseContent,sources $source]);return $response;}
}我希望在下面这段可以当 n e x t ( next( next(request); 出现异常被捕获
try {// 执行请求并获取响应$response $next($request);} catch (\Exception $exception) {// 重新抛出异常交由Laravel处理throw $exception;}然而并不行如果控制器中出现了异常会被laravel的全局异常处理机制捕获$response $next($request); 会返回捕获后的异常处理的类也就是异常已经被处理掉了
最终处理方案
在全局异常处理的时候将异常内容插入到request中然后在中间件去获取这个自定义的属性
全局处理文件中加入下面这段代码 namespace App\Exceptions;use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;class Handler extends ExceptionHandler
{/*** Render an exception into an HTTP response.** param \Illuminate\Http\Request $request* param \Throwable $exception* return \Symfony\Component\HttpFoundation\Response*/public function render($request, Throwable $exception){// 这里这段的内容是为了让异常内容可以被中间件获取// 因为控制器的异常会被laravel全局异常直接捕获导致中间件获取的内容是异常页面$request-attributes-set(exception_message, $exception-getMessage());return parent::render($request, $exception);}
}然后中间件中获取exception_message
?phpnamespace App\Http\Middleware;use Closure;
use Illuminate\Http\Request;
use App\Models\GameThirdPartyCallback;class ApiLoggingMiddleware
{public function handle(Request $request, Closure $next){$requestHeaders $request-header();$requestData $request-all();$source $request-header(referer) ?? $request-ip();$response $next($request); // 如果这里产生了异常不会在这里try catch。而是直接返回了response的错误内容$responseStatus $response-status();if ($responseStatus 400 $responseStatus 600) {GameThirdPartyCallback::create([request_headers json_encode($requestHeaders),callback_data json_encode($requestData),response_status $responseStatus,response_content $request-attributes-get(exception_message),sources $source]);} else {...}return $response;}}