forkrefactor / apixception-bundle
用于处理和渲染API风格项目中自定义异常的Bundle,使用symfony内核事件。
Requires
- php: ^7.4 | ^8.1
- ext-json: *
- symfony/framework-bundle: ^4.4|^5.0|^6.0
Requires (Dev)
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
)返回。
安装
-
使用composer下载并安装vendor。
$ composer require pccomponentes/apixception-bundle
-
在
config\bundles.php
中添加bundle。例如:<?php return [ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], PcComponentes\Apixception\ApixceptionBundle::class => ['all' => true] ];
-
编写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
接口的任何异常。该方法返回的数组将包含在响应中。
异常
如前所述,该库接受所有类型的异常。