Метод 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