Класс Handler
Класс Handler находится в файле app/Exceptions/Handler.php и наследуется от базового класса IlluminateFoundationExceptionsHandler. Он отвечает за обработку всех исключений, возникающих в приложении, и определяет, как эти ошибки должны быть преобразованы в HTTP-ответы. Основные методы класса включают report, render и shouldReport, которые позволяют управлять логированием ошибок, их отображением и условиями отправки уведомлений.
Синтаксис
Базовый синтаксис класса Handler:
<?php
namespace AppExceptions;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use Throwable;
class Handler extends ExceptionHandler
{
protected $dontReport = [];
protected $dontFlash = [];
public function register(): void
{
$this->reportable(function (Throwable $e) {
//
});
$this->renderable(function (Throwable $e, $request) {
//
});
}
}
?>
Пример
Регистрация обработчика для логирования ошибок с помощью метода reportable:
<?php
namespace AppExceptions;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use Throwable;
use IlluminateSupportFacadesLog;
class Handler extends ExceptionHandler
{
public function register(): void
{
$this->reportable(function (Throwable $e) {
if ($e instanceof CustomException) {
Log::channel('custom')->error('Custom error: ' . $e->getMessage());
}
});
}
}
?>
Результат выполнения кода:
"Custom error: User not found"
Пример
Настройка пользовательского отображения ошибок с помощью метода renderable:
<?php
namespace AppExceptions;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use Throwable;
use IlluminateHttpRequest;
use IlluminateHttpResponse;
class Handler extends ExceptionHandler
{
public function register(): void
{
$this->renderable(function (Throwable $e, Request $request) {
if ($e instanceof CustomException && $request->is('api/*')) {
return response()->json([
'error' => 'Custom error occurred',
'message' => $e->getMessage(),
], 400);
}
});
}
}
?>
Результат выполнения кода:
{"error":"Custom error occurred","message":"Invalid input data"}
Пример
Использование метода render для явной обработки исключений:
<?php
namespace AppExceptions;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use Throwable;
use IlluminateHttpRequest;
use IlluminateHttpResponse;
class Handler extends ExceptionHandler
{
public function render($request, Throwable $exception)
{
if ($this->isHttpException($exception)) {
$statusCode = $exception->getStatusCode();
if ($statusCode === 404) {
return response()->view('errors.404', [], 404);
}
if ($statusCode === 403) {
return response()->view('errors.403', [], 403);
}
}
return parent::render($request, $exception);
}
}
?>
Результат выполнения кода:
<!-- Content of errors/404.blade.php -->
<h1>Page Not Found</h1>
<p>The requested page could not be found.</p>
Пример
Настройка списка исключений, которые не нужно логировать, с использованием свойства dontReport:
<?php
namespace AppExceptions;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use Throwable;
use IlluminateValidationValidationException;
use IlluminateAuthAuthenticationException;
class Handler extends ExceptionHandler
{
protected $dontReport = [
ValidationException::class,
AuthenticationException::class,
];
}
?>
Результат выполнения кода:
"Exceptions not logged: ValidationException, AuthenticationException"
Смотрите также
-
метод
report,
который определяет логику логирования исключений -
метод
render,
который преобразует исключение в HTTP-ответ -
метод
shouldReport,
который определяет, нужно ли логировать исключение -
класс
Exceptions,
который предоставляет API для регистрации обработчиков