перезапись обработчика исключений Laravel при разработке пакета Laravel

#php #laravel #exception #package #handler

Вопрос:

Я пишу пакет Laravel, и есть несколько маршрутов, которые возвращают ответ JSON, и я хочу, чтобы в пакете был мой собственный обработчик исключений, а не обработчик Laravel, но я не могу его перезаписать. была дискуссия об этом, но это больше не работает

Я пишу этот синглтон в своем методе построения поставщика услуг пакетов и контроллера, но он не работает

мой поставщик услуг:

 namespace RabsanaTradeProviders;
use IlluminateSupportServiceProvider;

class TradeServiceProvider extends ServiceProvider
{

    public function boot()
    {
        $this->app->singleton(
            IlluminateContractsDebugExceptionHandler::class,
            RabsanaTradeExceptionsHandler::class
        );
    }


    public function register()
    {
        // 
    }
 

мой контроллер:

 
use IlluminateRoutingController;
use IlluminateDatabaseEloquentModelNotFoundException;

class TestController extends Controller
{

    public function __construct()
    {
        App::singleton(
            IlluminateContractsDebugExceptionHandler::class,
            RabsanaTradeExceptionsHandler::class
        );
    }
    public function index()
    {
        throw new ModelNotFoundException();
    }
}
 

мой куратор на посылке:

 namespace RabsanaTradeExceptions;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use Throwable;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'current_password',
        'password',
        'password_confirmation',
    ];

    /**
     * Register the exception handling callbacks for the application.
     *
     * @return void
     */
    public function register()
    {
        $this->reportable(function (Throwable $e) {
            //
        });
    }


    /**
     * Render an exception into an HTTP response.
     *
     * @param  IlluminateHttpRequest $request
     * @param  Throwable               $exception
     * @return IlluminateHttpResponse
     */
    public function render($request, Throwable $exception)
    {

        dd('here');
        return parent::render($request, $exception);
    }
}

 

после создания исключения метод рендеринга AppExceptionsHandler.php будет выполнен, но я хочу RabsanaTradeExceptionsHandler.php , чтобы он был выполнен

Ответ №1:

Я не знаю другого метода переопределения обработчика исключений Laravel (кроме метода, показанного в вашем примере), не требующего от пользователя вносить изменения в App/Exceptions/Handler.php файл вручную или вручную переопределять привязку для обработчика.

Что вы могли бы сделать, так это потребовать, чтобы пользователь добавил в свой App/Exceptions/Handler.php файл фрагмент кода, который запустит ваш пакет.

Часовой делает это следующим образом:

 // App/Exceptions/Handler.php

public function register()
{
    $this->reportable(function (Throwable $e) {
        if ($this->shouldReport($e) amp;amp; app()->bound('sentry')) {
            app('sentry')->captureException($e);
        }
    });
}