jnewer/exception-handler

Webman plugin jnewer/exception-handler

v1.0.7 2024-08-16 09:01 UTC

This package is auto-updated.

Last update: 2024-10-16 09:22:51 UTC


README

Latest Version on Packagist Total Downloads License PHP Version Require

该插件扩展了webman的Handler类,webman的Handler只能对同一应用下的异常进行统一处理,而该插件可以针对同一应用的不同异常进行不同的处理。

安装

composer require jnewer/exception-handler

配置

config/exception.php

return [
    // 这里配置异常处理类,有单独配置Handler的异常,会自动分发给对应的Handler处理
    '' => \Jnewer\ExceptionHandler\Handler::class,
];

config/plugin/jnewer/exception-handler.php

use Illuminate\Validation\ValidationException;
use Jnewer\ExceptionHandler\Exception\BaseException;
use Jnewer\ExceptionHandler\BaseExceptionHandler;
use Jnewer\ExceptionHandler\ValidationExceptionHandler;

return [
    'enable' => true,
    'exception' => [
        // 这里配置异常类和对应的处理类
        'handlers' => [
            ValidationException::class => ValidationExceptionHandler::class,
            BaseException::class => BaseExceptionHandler::class
        ],
        'dont_report' => [
            BusinessException::class,
            BaseException::class,
            ValidationException::class,
        ]
    ]
];

多应用模式时,你可以为每个应用单独配置异常处理类,参见多应用

基本用法

use support\Request;
use support\Response;
use Jnewer\ExceptionHandler\Exception\NotFoundHttpException;

class UserController{
    public function view($id): Response
    {
        $user = User::find($id);
        if (is_null($user)) {
            throw new NotFoundHttpException('用户不存在');
        }
    }
}

以上异常抛出错误信息,如下格式:

HTTP/1.1 404 Not Found
Content-Type: application/json;charset=utf-8

{
    "code": 0,
    "success": false,
    "message": "用户不存在",
    "data": [],
}

内置异常类

  • 客户端异常类(HTTP Status 400):NotFoundHttpException
  • 身份认证异常类(HTTP Status 401):UnauthorizedHttpException
  • 资源授权异常类(HTTP Status 403):ForbiddenHttpException
  • 资源未找到异常类(HTTP Status 404):NotFoundHttpException
  • 请求方法不允许异常类(HTTP Status 405):MethodNotAllowedHttpException
  • 请求内容类型不支持异常类(HTTP Status 406):NotAcceptableHttpException
  • 请求限流在异常类(HTTP Status 429):TooManyRequestsHttpException
  • 服务器内部错误异常类(HTTP Status 500):ServerErrorHttpException

更多参考:https://datatracker.ietf.org/doc/html/rfc7231#page-47

自定义异常类

<?php

namespace support\exception;

use Jnewer\ExceptionHandler\Exception\BaseException;

class InvalidArgumentException extends BaseException
{
}

使用异常类

use support\Request;
use support\Response;
use support\exception\InvalidArgumentException;

class UserController{
    public function create(Request $request): Response
    {
        if (!$request->post('name')) {
            throw new InvalidArgumentException('参数有误');
        }
    }
}

内置异常类Handler

  • 扩展自webman的Handler:Handler,可以针对不同的异常类进行不同的处理。
  • BaseException异常处理:BaseExceptionHandler
  • laravel验证器异常处理:ValidationExceptionHandler

自定义异常类Handler

<?php

namespace support\exception;
use support\exception\Handler;
use Illuminate\Validation\ValidationException;
use Throwable;
use function json_encode;

class InvalidArgumentExceptionHandler extends Handler
{
    public function render(Request $request, Throwable $exception): Response
    {
        $message = $exception->getMessage();
        $statusCode = $exception->statusCode ?? 500;
        if (!$request->expectsJson()) {
            return new Response($statusCode, [], $message);
        }

        $jsonMessage = ['code' => $exception->code ?: $exception->statusCode, 'message' => $message, 'success' => false, 'data' => []];
        return new Response(
            $statusCode,
            ['Content-Type' => 'application/json'],
            json_encode($jsonMessage, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)
        );
    }
}

配置Handler

config/plugin/jnewer/exception-handler.php

use app\exception\InvalidArgumentException;
use app\exception\InvalidArgumentExceptionHandler;

return [
    'exception' => [
        // 这里配置异常类和对应的处理类
        'handlers' => [
            ...// 其他异常和处理类
            InvalidArgumentException::class => InvalidArgumentExceptionHandler::class
        ]
    ]
];