Метод render
Метод render определён в классе AppExceptionsHandler
и вызывается автоматически при возникновении исключения в приложении.
Он преобразует объект исключения в HTTP-ответ, который будет отправлен
клиенту. Метод принимает два параметра: объект запроса $request
и объект исключения $exception. По умолчанию он вызывает
родительский метод для стандартной обработки, но вы можете переопределить
его для кастомной логики.
Синтаксис
<?php
namespace AppExceptions;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
class Handler extends ExceptionHandler
{
public function render($request, Throwable $exception)
{
// custom rendering logic
return parent::render($request, $exception);
}
}
?>
Пример
Давайте переопределим метод render для возврата JSON-ответа
при ошибке валидации:
<?php
namespace AppExceptions;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use IlluminateValidationValidationException;
use Throwable;
class Handler extends ExceptionHandler
{
public function render($request, Throwable $exception)
{
if ($exception instanceof ValidationException) {
return response()->json([
'status' => 'error',
'message' => 'Validation failed',
'errors' => $exception->errors()
], 422);
}
return parent::render($request, $exception);
}
}
?>
Результат выполнения кода при ошибке валидации:
{
"status": "error",
"message": "Validation failed",
"errors": {
"email": ["The email field is required."]
}
}
Пример
Давайте переопределим метод render для отображения
кастомной страницы ошибки для NotFoundHttpException:
<?php
namespace AppExceptions;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use SymfonyComponentHttpKernelExceptionNotFoundHttpException;
use Throwable;
class Handler extends ExceptionHandler
{
public function render($request, Throwable $exception)
{
if ($exception instanceof NotFoundHttpException) {
return response()->view('errors.custom_404', [], 404);
}
return parent::render($request, $exception);
}
}
?>
Результат выполнения кода при обращении к несуществующей странице:
<!DOCTYPE html>
<html>
<body>
<h1>Custom 404 Page</h1>
<p>Page not found</p>
</body>
</html>
Пример
Давайте переопределим метод render для обработки различных
типов исключений с разными HTTP-статусами:
<?php
namespace AppExceptions;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use IlluminateAuthAuthenticationException;
use IlluminateValidationValidationException;
use SymfonyComponentHttpKernelExceptionAccessDeniedHttpException;
use SymfonyComponentHttpKernelExceptionNotFoundHttpException;
use Throwable;
class Handler extends ExceptionHandler
{
public function render($request, Throwable $exception)
{
if ($exception instanceof AuthenticationException) {
return response()->json([
'status' => 'error',
'message' => 'Unauthenticated'
], 401);
}
if ($exception instanceof AccessDeniedHttpException) {
return response()->json([
'status' => 'error',
'message' => 'Forbidden'
], 403);
}
if ($exception instanceof ValidationException) {
return response()->json([
'status' => 'error',
'message' => 'Validation failed',
'errors' => $exception->errors()
], 422);
}
return parent::render($request, $exception);
}
}
?>
Результат выполнения кода при ошибке аутентификации:
{
"status": "error",
"message": "Unauthenticated"
}
Пример
Давайте переопределим метод render для логирования
и отправки уведомлений при критических ошибках:
<?php
namespace AppExceptions;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;
use IlluminateSupportFacadesLog;
use AppServicesNotificationService;
use Throwable;
class Handler extends ExceptionHandler
{
protected $notificationService;
public function __construct(NotificationService $notificationService)
{
parent::__construct();
$this->notificationService = $notificationService;
}
public function render($request, Throwable $exception)
{
if ($exception instanceof CriticalException) {
Log::critical('Critical error occurred', [
'message' => $exception->getMessage(),
'code' => $exception->getCode(),
'file' => $exception->getFile(),
'line' => $exception->getLine()
]);
$this->notificationService->sendAdminAlert($exception);
return response()->json([
'status' => 'error',
'message' => 'Critical error occurred'
], 500);
}
return parent::render($request, $exception);
}
}
?>
Результат выполнения кода при критической ошибке:
{
"status": "error",
"message": "Critical error occurred"
}
Смотрите также
-
метод
report,
который определяет логику логирования исключений -
метод
shouldReport,
который определяет, нужно ли логировать исключение -
класс
Handler,
который является базовым классом для обработки исключений -
класс
renderable,
который позволяет регистрировать кастомную отрисовку для исключений