tounaf / exception-bundle
symfony项目的异常处理器
Requires
- symfony/config: 6.4.* || 6.3.* || 6.2.* || 6.1.* || 5.4.* || 4.4.*
- symfony/dependency-injection: 6.4.* || 6.3.* || 6.2.* || 6.1.* || 5.4.* || 4.4.*
- symfony/framework-bundle: 6.4.* || 6.3.* || 6.2.* || 6.1.* || 5.4.* || 4.4.*
- symfony/http-kernel: 6.4.* || 6.3.* || 6.2.* || 6.1.* || 5.4.* || 4.4.*
- tounaf/exception-handler: ^1.4
Requires (Dev)
- enlightn/security-checker: ^1.11
- friendsofphp/php-cs-fixer: ^3.39
- rector/rector: ^1.0
- squizlabs/php_codesniffer: *
- symfony/maker-bundle: ^1.48
- symfony/test-pack: ^1.1
- symfony/var-dumper: ^6.4 || ^6.3 || ^6.2
This package is auto-updated.
Last update: 2024-09-19 14:36:02 UTC
README
如果您需要管理应用中的复杂异常,此组件专为您的需求设计。此组件提供接口,以方便在symfony项目中自定义异常渲染。每个您创建的异常都有自己的处理器类。您的异常将具有可扩展性、可维护性和独立性。
1 - 安装
composer require tounaf/exception-bundle
2 - 如何使用
默认情况下,此组件处理异常并渲染JSON响应,但您可以根据需求自定义此行为(例如:HTML)
3 - 创建自定义异常处理器
创建一个类并实现PulseExceptionInteface接口。它包含两个方法
** handleException: 此方法接收Throwable作为参数并返回一个symfony响应
** supportsException: 此方法接收Throwable作为参数并返回布尔值。
示例
首先创建应用程序通过异常处理的异常。
<?php namespace App\Handler\Exception; class MyException extends \Exception { }
然后创建处理此异常的处理程序
<?php namespace App\Handler\Exception; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\JsonResponse; use Tounaf\ExceptionBundle\ExceptionHandlerInterface; class MyExceptionHandler implements ExceptionHandlerInterface { // return an JsonResponse public function handleException(\Throwable $throwable): Response { // your logic return new JsonResponse(['message' => $throwable->getMessage(), 'code' => 12]); } // public function supportsException(\Throwable $throwable): Response { return $throwable instanceof MyException; } }
当MyException被抛出时,系统会调用MyExceptionHandler类。例如
namespace App\Service; use App\Handler\Exception\MyException; class MyService { public function someFunction() { // your logic throw new MyException(); } }
3 - 格式化响应
有时,您的应用程序提供了第三方可以消费的服务:例如
/api/users/list returns a json {"data": [{"name":"user1"}, {"name":"user2"}]}
但uri
/admin/users/list renders an html page
An HandlerException可以提供多种响应格式,如html、json等。
默认情况下,此组件支持html和json作为响应格式,但它可以扩展以创建自定义格式,如json-ld、xml等。
为此,您需要实现Tounaf\ExceptionBundle\FormatResponse\FormatResponseCheckerInterface接口。
此接口有一个名为setFormat的setFormat(FormatResponseInterface $formatResponse)方法,它接受FormatResponseInterface作为参数。
<?php namespace App\Handler\Exception; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\JsonResponse; use Tounaf\ExceptionBundle\ExceptionHandlerInterface; use Tounaf\ExceptionBundle\FormatResponse\FormatResponseCheckerInterface; class MyExceptionHandler implements ExceptionHandlerInterface, FormatResponseCheckerInterface { private FormatResponseInterface $formatResponse; // return an JsonResponse public function handleException(\Throwable $throwable): Response { // your logic return $this->formatResponse->render( ['message' => $throwable->getMessage()] ) } // public function supportsException(\Throwable $throwable): Response { return $throwable instanceof MyException; } public function setFormat(FormatResponseInterface $formatResponse): void { $this->formatResponse = $formatResponse; } }
这段代码会发生什么?如上所述,此组件默认提供了两个响应:html和json。此代码中的哪个格式?对于匹配/api/的URI,使用的响应是json,否则渲染html。