#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);
}
});
}