Files
wh-api/app/Exception/Handler/ApiExceptionHandler.php
ykxiao 0b2299c427
Some checks failed
Build Docker / build (push) Has been cancelled
协程版仓库后端项目
2025-07-08 14:59:47 +08:00

94 lines
2.5 KiB
PHP

<?php
/**
* Author: ykxiao
* Date: 2025/6/3
* Time: 下午8:51
* Description:
*
* (c) ykxiao <yk_9001@hotmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
declare(strict_types=1);
namespace App\Exception\Handler;
use App\Exception\ApiException;
use App\Log\Log;
use Hyperf\Context\ApplicationContext;
use Hyperf\ExceptionHandler\ExceptionHandler;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\Validation\ValidationException;
use Psr\Http\Message\ResponseInterface;
use Throwable;
/**
* Author: ykxiao
* Date: 2025/6/3
* Time: 下午8:54
* Description: 统一异常处理
*
* (c) ykxiao <yk_9001@hotmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
class ApiExceptionHandler extends ExceptionHandler
{
public function __construct(protected ApplicationContext $context)
{
}
/**
* 处理异常
* @param Throwable $throwable
* @param ResponseInterface $response
* @return ResponseInterface
*/
public function handle(Throwable $throwable, ResponseInterface $response): ResponseInterface
{
$errorData = $this->getErrorData($throwable);
// 记录日志
Log::get('default', 'default')->error($errorData['logMessage']);
// 阻止异常冒泡
$this->stopPropagation();
return $response->withStatus(200)
->withHeader('Content-Type', 'application/json')
->withBody(new SwooleStream(json_encode($errorData['responseData'], JSON_UNESCAPED_UNICODE)));
}
public function isValid(Throwable $throwable): bool
{
return $throwable instanceof ApiException || $throwable instanceof ValidationException;
}
/**
* 获取错误.
*/
protected function getErrorData(Throwable $throwable): array
{
$code = $throwable->getCode();
$errorFile = $throwable->getFile();
$errorLine = $throwable->getLine();
$errorMessage = $throwable->getMessage();
if ($throwable instanceof ValidationException) {
$errors = $throwable->validator->errors()->toArray();
$errorMessage = reset($errors)[0];
}
$responseData = [
'code' => $code,
'message' => $errorMessage,
];
$logMessage = sprintf('%s %s %s %s', $code, $errorFile, $errorLine, $errorMessage);
return ['responseData' => $responseData, 'logMessage' => $logMessage];
}
}