wyrihaximus/json-throwable

📠 JSON 编码和解码可抛出对象和异常

4.2.0 2024-05-09 13:10 UTC

This package is auto-updated.

Last update: 2024-09-10 22:24:37 UTC


README

Continuous Integration Latest Stable Version Total Downloads Code Coverage Type Coverage License

安装

通过 Composer 安装,使用以下命令,它将自动检测最新版本并将其与 ~ 绑定。

composer require wyrihaximus/json-throwable

使用方法

本包包含四个函数

  • throwable_json_encode - 将任何可抛出对象编码为 JSON 字符串
  • throwable_encode - 将任何可抛出对象编码为数组
  • throwable_json_decode - 将 throwable_json_encode 格式的 JSON 字符串解码回原始的 ExceptionError
  • throwable_decode - 将 throwable_encode 格式的数组解码回原始的 ExceptionError

注意

在使用此包时有一些需要注意的问题。

  • 编码函数都会丢弃跟踪信息。
  • 因为我们不能覆盖跟踪信息,所以当可用时,会在 originalTrace 属性中放置一个新的跟踪信息。
  • 任何之前的 Throwable 也会被编码和解码,但始终使用 throwable_json_*

获取原始跟踪的示例,这不是最优的,但它是可行的

<?php

declare(strict_types=1);

final class ExposeTraceException extends Exception
{
    /** @var array<array<string, mixed>> */
    private array $originalTrace = [];

    /**
     * @return array<array<string, mixed>>
     */
    public function getOriginalTrace(): array
    {
        return $this->originalTrace;
    }
}

或者您可以使用此包提供的 trait

<?php

declare(strict_types=1);

use WyriHaximus\ExposeTraceTrait;

final class ExposeTraceException extends Exception
{
    use ExposeTraceTrait;
}

包括额外的属性

如果您的可抛出对象包含任何希望在编码时携带的属性,实现 AdditionalPropertiesInterface 并返回一个包含所有希望包含在编码中的属性的列表

<?php

declare(strict_types=1);

use WyriHaximus\AdditionalPropertiesInterface;
use WyriHaximus\ExposeTraceTrait;

final class AdditionalPropertiesException extends Exception implements AdditionalPropertiesInterface
{
    use ExposeTraceTrait;

    private int $time;

    public function __construct(int $time)
    {
        parent::__construct('Additional properties exception raised');
        $this->time = $time;
    }

    public function time(): int
    {
        return $this->time;
    }

    /**
     * @return array<string>
     */
    public function additionalProperties(): array
    {
        return ['time'];
    }
}

编码/解码数组类型提示

当您调用 throwable_encodethrowable_decode 时,数组的(返回)类型提示具有以下签名

array{class: class-string<Throwable>, message: string, code: mixed, file: string, line: int, previous: string|null, originalTrace: array<int, mixed>, additionalProperties: array<string, string>}

此签名不是由 PHP 强制执行,但像 PHPStanPsalm 这样的工具将使用它来从静态分析的角度断言类型安全。

贡献

有关详细信息,请参阅 CONTRIBUTING

许可

版权所有 2020 Cees-Jan Kiewiet

特此授予任何获得此软件及其相关文档副本(“软件”)的人免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,以及允许向软件提供方提供软件的人这样做,前提是

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者都不应对任何索赔、损害或其他责任负责,无论该索赔、损害或其他责任是由合同、侵权行为或其他方式引起的,与软件或其使用或其他交易有关。