forkrefactor / apixception-bundle

用于处理和渲染API风格项目中自定义异常的Bundle,使用symfony内核事件。

v1.0.0 2021-12-08 16:57 UTC

This package is not auto-updated.

Last update: 2024-09-27 05:17:41 UTC


README

该库的目标是帮助程序员渲染控制器接收到的异常,如API响应。它通过使用Symfony框架v4的Kernel的Kernel.exception事件来集成。响应将以JSON格式(Symfony\Component\HttpFoundation\JsonResponse)返回。

安装

  1. 使用composer下载并安装vendor。

    $ composer require pccomponentes/apixception-bundle
  2. config\bundles.php中添加bundle。例如:

    <?php
    
    return [
        Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],  
        PcComponentes\Apixception\ApixceptionBundle::class => ['all' => true]  
    ];
  3. 编写bundle的配置文件,指定要捕获的异常及其生成响应的转换。为此,在config/packages路径下创建一个名为apixception.yaml的文件。其内容示例如下:

    apixception:
      - exception: PcComponentes\Ddd\Domain\Exception\NotFoundException
        transformer: PcComponentes\Apixception\Core\Transformer\JsonSerializableTransformer
        http_code: 404
      - exception: PcComponentes\Ddd\Domain\Exception\ExistsException
        transformer: PcComponentes\Apixception\Core\Transformer\JsonSerializableTransformer
        http_code: 409
      - exception: PcComponentes\Ddd\Domain\Exception\LogicException
        transformer: PcComponentes\Apixception\Core\Transformer\JsonSerializableTransformer
        http_code: 409
      - exception: \Throwable
        transformer: PcComponentes\Apixception\Core\Transformer\NoSerializableTransformer
        http_code: 500

    此文件将根据使用项目的要求修改,以添加或删除必要的规则。

配置

该文件应包含规则列表。每个规则必须包括:

  • exception:表示要捕获的异常类型的类或接口的名称,包括命名空间。
  • http_code:将返回的Symfony\Component\HttpFoundation\JsonResponse对象的HTTP代码。
  • transformer:包含命名空间的类,将异常转换为一个可序列化为Symfony\Component\HttpFoundation\JsonResponse对象的数组。

创建新的转换器

尽管应用程序提供了一些基本的转换器,但它允许每个项目注入自己的转换器。异常必须实现\Throwable接口或从已实现该接口的类继承。转换器是必须从PcComponentes\Apixception\Core\Transformer\ExceptionTransformer类继承的类。出于简化的考虑,不允许注入依赖项,因此继承该类意味着有一个空的构造函数并包含轻量级的转换逻辑。

一个示例的自定义转换器如下:

<?php
namespace MyApp\Transformers;

use PcComponentes\Apixception\Core\Transformer\ExceptionTransformer;

class CustomTransformer extends ExceptionTransformer
{
	public function transform(\Throwable $exception): array
	{
		return [
			'exception' => \get_class($exception),
			'message' => $exception->getMessage(),
		];
	}
}

如果收到一个具有独特方法的自定义异常,可以使用它。确保在配置中保证只向转换器传递预期的异常类型,或者让转换器相应地执行。

可用的转换器

该库提供了两个可以从一开始使用的转换器。

  • PcComponentes\Apixception\Core\Transformer\NoSerializableTransformer:此转换器能够渲染任何类型的异常。在响应中,它将包含一个包含属性exception(异常名称)和message(异常消息)的JSON对象。
  • PcComponentes\Apixception\Core\Transformer\JsonSerializableTransformer:此转换器能够渲染实现\JsonSerializable接口的任何异常。该方法返回的数组将包含在响应中。

异常

如前所述,该库接受所有类型的异常。