glance-project/error-middleware

错误中间件

v1.0.1 2024-08-05 13:11 UTC

This package is auto-updated.

Last update: 2024-09-05 13:22:08 UTC


README

一个兼容 PSR-7PSR-15 的错误处理中间件

安装

使用 Composer 安装

composer require glance-project/error-handler

入门指南

错误处理器应该是最先由您的应用程序执行的中件。在 Slim 中,最后注册的中件首先执行。

$app = \Slim\App::create();

$logger = /* ... */;
$errorMiddleware = ErrorMiddleware::create();
$errorMiddleware->setLogger($logger); // Optional. Accepts any PSR-3 logger
$errorMiddleware->debugMode(true);    // Optional. Set to false on production
$errorMiddleware->useSentry();        // Optional. Sentry must be installed and configured

$app->add(/* other middleware */);
$app->add($errorMiddleware);

/* Register routes here */

$app->run();

如果错误处理器不是首先注册的中件,那么先前中件抛出的异常将无法得到适当处理。

异常

初始化后,所有未捕获的异常都由该库处理。

ErrorMiddleware 根据异常的类型表现不同。

BaseException

在开发应用程序时,有时希望终止一切并返回错误给用户。此库提供了一个封装一个或多个错误的 BaseException

Error 部分遵循 JSON API 标准,以下为可选字段

  • 标题
  • 细节
  • 代码
  • HTTP 状态码
  • 来源
$errors = [
    new Error("Invalid email", "Email is bad formatted."),
    new Error(
        "Invalid password",
        "Password should contain at least 6 characters.",
        12345,
        400,
        new ErrorSource("user/password")
    ),
];

throw new BaseException(400, $errors);

上面的代码在您的应用程序中会产生以下 HTTP 响应

状态:400

{
    "status": 400,
    "errors": [
        {
            "title": "Invalid email",
            "details": "Email is bad formatted."
        }
        {
            "title": "Invalid password",
            "details": "Password should contain at least 6 characters.",
            "code": 12345,
            "status": 400,
            "source": { "pointer": "user/password" }
        }
    ]
}

您也可以通过扩展 BaseException 创建自定义异常。

其他异常

任何其他类型的未捕获异常将导致以下 HTTP 响应。

状态:500

{
    "errors": [
        {
            "status": 500,
            "title": "Internal Error",
            "detail": "An unexpected server error occurred."
        }
    ]
}

如果 debugMode 开启,则会在响应体中附加额外的调试信息,例如文件、行、消息和跟踪。

使用 Sentry

要将未知错误发送到 Sentry,请安装并初始化 sentry/sdk。有关在 PHP 上设置 Sentry 的更多信息,请参阅官方文档

composer require sentry/sdk
<?php

\Sentry\init([
    "dsn"         => getenv("SENTRY_DSN"),
    "environment" => getenv("ENVIRONMENT"),
]);

$app = \Slim\App::create();

$logger = /* ... */;

$errorMiddleware = ErrorMiddleware::create();
$errorMiddleware->useSentry();

$app->add(/* other middleware */);
$app->add($errorMiddleware);

// Register routes here...

$app->run();