oguz-yilmaz/trammel

为 Laravel 提供独特的异常处理程序

v1.0.0 2022-06-26 17:25 UTC

This package is auto-updated.

Last update: 2024-09-26 22:26:50 UTC


README

关于 Trammel

处理异常对所有类型的应用程序至关重要。正确并标准化可以提高应用程序的质量,使其易于推理。在 Laravel 中,你可以应用的配置不多,并且只有一个地方可以构建所有异常,那就是 Handler.php。由于需要自定义异常处理,该文件很快就会变得相当丑陋,到处都是 if-else 语句。这个库提供了默认的异常处理和不同类型异常的标准输出格式(验证异常Ajax 或 Json 异常组合),以及为每种类型提供不同的处理程序,您可以在其中扩展和自定义。

安装

composer require oguz-yilmaz/trammel

版本兼容性

异常处理程序类型和默认输出格式

Trammel 为大多数情况提供了通用处理程序。每个处理程序都提供可扩展的通用输出格式。下面列出它们所指的内容以及它们作为响应格式提供的内容。

用法

默认输出格式

如果您想使用默认输出格式,您可以直接在 app/Exception 文件夹中使用 Trammel 的 BaseHandler 类扩展 Handler 类。

// app/Exception/Handler.php
use Oguz\Trammel\Exception\BaseHandler;

class Handler extends BaseHandler
{
    // if class has render method, remove it
}

自定义处理程序

如果您不想使用处理程序的默认行为,您可以扩展它。首先,在 app/Exception 下创建一个新的文件夹名为 Handlers,以保存我们的自定义异常处理程序。这将使其更加整洁和干净。

<?php

namespace App\Exceptions\Handlers;

use Symfony\Component\HttpFoundation\Response;
use Oguz\Trammel\Handlers\AjaxHandler;
use Illuminate\Http\Request;
use Throwable;

class CustomAjaxHandler extends AjaxHandler
{
    protected function handle(Request $request, Throwable $exception): Response
    {
        return response()->json([
            'success' => true
        ]);
    }
}

然后,您需要将这些自定义异常处理程序添加到来自 Oguz\Trammel\Exception\BaseHandler 类的 App\Exception\Handler 类的 $handlers 属性中。

namespace App\Exceptions;

use App\Exceptions\Handlers\CustomAjaxHandler;
use Oguz\Trammel\Exception\BaseHandler;

class Handler extends BaseHandler
{
    protected array $handlers = [
        CustomAjaxHandler::class
    ];
    
    //...
}

这些异常将如何触发

所以我们有不同类型的处理程序来处理不同类型的异常。但是,我们什么时候会得到这些类型的异常呢?下面是一个示例控制器,它将让您了解在哪种情况下会抛出哪种异常类型。

<?php

namespace App\Http\Controllers;


use Illuminate\Validation\ValidationException;
use Illuminate\Http\Request;
use Exception;

class IndexController extends Controller
{
    // $request->isJson() === false && $request->ajax() === false
    public function index()
    {
        throw new Exception('Generic exception that will be passed to Laravel');
    }

    // $request->isJson() === false && $request->ajax() === false
    public function validation(Request $request)
    {
        throw ValidationException::withMessages(['message' => 'Validation Exception']);
    }

    // $request->ajax() === true
    public function ajax(Request $request)
    {
        throw new Exception('AJAX Exception');
    }

    // $request->isJson() === true
    public function json(Request $request)
    {
        throw new Exception('JSON Exception');
    }

    // $request->ajax() === true
    public function ajaxValidation(Request $request)
    {
        throw ValidationException::withMessages(['message' => 'AJAX Validation Exception']);
    }

    // $request->isJson() === true
    public function jsonValidation(Request $request)
    {
        throw ValidationException::withMessages(['message' => 'JSON Validation Exception']);
    }
}

有关每种异常类型的详细信息,请参阅上面