香洲二院小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
mini_xzey/app/Http/Middleware/RecordApiLog.php

80 lines
2.6 KiB

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Symfony\Component\HttpFoundation\Response as HttpResponse;
class RecordApiLog
{
/**
* @param Request $request
* @param Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next): mixed
{
$request->attributes->set('start_time', microtime(true));
return $next($request);
}
/**
* @param Request $request
* @param Response|JsonResponse|HttpResponse $response
*/
public function terminate(Request $request, Response|JsonResponse|HttpResponse $response): void
{
//结束时间
$end = microtime(true);
$diff = $end - $request->attributes->get('start_time');
$ip = json_encode($request->ips(),256);
if ($response instanceof JsonResponse) {
$response_str = $this->getJsonResponseStr($response);
} else {
$response_str = $this->getResponseStr($response);
}
// 回调消息获取request_data
if (stripos($request->url, 'notify') !== false) {
$request_data = file_get_contents('php://input') ?: file_get_contents('php://temp');
} else {
$request_data = request()->all();
}
recordLog('RecordApiUse', implode("\n", [
'请求地址: '. $ip. '|'. $request->method(). '|'. $request->url(),
'请求入参: '. json_encode($request_data, JSON_UNESCAPED_UNICODE),
'请求出参: '. $response_str,
'耗时: '. sprintf("%.6f", $diff). 's'
]));
}
/**
* 获取响应字符串
* @param Response|HttpResponse $response
* @return string
*/
protected function getResponseStr(Response|HttpResponse $response): string
{
return PHP_EOL. sprintf('HTTP/%s %s %s', $response->getProtocolVersion(), $response->getStatusCode(), Response::$statusTexts[$response->getStatusCode()]). PHP_EOL.
$response->headers. PHP_EOL.
json_encode($response->getContent(), JSON_UNESCAPED_UNICODE);
}
/**
* 获取json相应字符串
* @param JsonResponse $response
* @return string
*/
protected function getJsonResponseStr(JsonResponse $response): string
{
return PHP_EOL. sprintf('HTTP/%s %s %s', $response->getProtocolVersion(), $response->getStatusCode(), Response::$statusTexts[$response->getStatusCode()]). PHP_EOL.
$response->headers. PHP_EOL. json_encode($response->getData(), JSON_UNESCAPED_UNICODE);
}
}