tounaf/exception-bundle

symfony项目的异常处理器

安装: 89

依赖者: 0

建议者: 0

安全性: 0

星标: 1

关注者: 1

分支: 2

开放问题: 2

类型:symfony-bundle

v2.2.1 2024-06-19 13:54 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。