РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
700 of 1392 menu

Метод reportable

Метод reportable применяется к объекту класса Exceptions в файле app/Exceptions/Handler.php и позволяет зарегистрировать пользовательскую логику отправки отчётов для конкретного типа исключений. Первым параметром передаётся класс исключения, вторым - замыкание, которое получает экземпляр исключения и должно вернуть значение, определяющее, был ли отчёт отправлен.

Синтаксис

<?php $this->reportable(ExceptionClass::class, function (ExceptionClass $e) { // пользовательская логика отправки отчёта return true; // отчёт отправлен }); ?>

Пример

Давайте зарегистрируем обработчик для исключения ModelNotFoundException, который будет отправлять уведомление в Slack при возникновении ошибки:

<?php namespace AppExceptions; use IlluminateFoundationExceptionsHandler as BaseHandler; use IlluminateDatabaseEloquentModelNotFoundException; use IlluminateSupportFacadesLog; class Handler extends BaseHandler { public function register(): void { $this->reportable(ModelNotFoundException::class, function (ModelNotFoundException $e) { Log::channel('slack')->error('Model not found: ' . $e->getMessage()); return true; }); } } ?>

Результат выполнения кода:

"Model not found: No query results for model [App\Models\Article]."

Пример

Давайте создадим обработчик для исключения QueryException, который будет отправлять отчёт только при определённых условиях, например, при превышении времени выполнения запроса:

<?php namespace AppExceptions; use IlluminateFoundationExceptionsHandler as BaseHandler; use IlluminateDatabaseQueryException; use IlluminateSupportFacadesLog; class Handler extends BaseHandler { public function register(): void { $this->reportable(QueryException::class, function (QueryException $e) { if (str_contains($e->getMessage(), 'max_execution_time')) { Log::error('Query timeout: ' . $e->getSql()); return true; } return false; }); } } ?>

Результат выполнения кода при возникновении таймаута:

"Query timeout: select * from articles where status = 'published'"

Пример

Давайте зарегистрируем несколько обработчиков для разных типов исключений с использованием метода reportable:

<?php namespace AppExceptions; use IlluminateFoundationExceptionsHandler as BaseHandler; use IlluminateDatabaseUniqueConstraintViolationException; use IlluminateValidationValidationException; use IlluminateSupportFacadesLog; class Handler extends BaseHandler { public function register(): void { $this->reportable(ValidationException::class, function (ValidationException $e) { Log::warning('Validation error: ' . json_encode($e->errors())); return true; }); $this->reportable(UniqueConstraintViolationException::class, function (UniqueConstraintViolationException $e) { Log::error('Duplicate entry: ' . $e->getMessage()); return true; }); } } ?>

Результат выполнения кода при возникновении ошибки валидации:

"Validation error: {\"email\":[\"The email has already been taken.\"]}"

Смотрите также

  • метод report,
    который используется для отправки отчётов об исключениях в обработчике
  • метод renderable,
    который регистрирует пользовательскую логику рендеринга исключений
  • метод dontReport,
    который указывает исключения, которые не следует отправлять в отчёты
  • класс Handler,
    который является основным обработчиком исключений в Laravel
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить