Метод renderable
Метод renderable класса Exceptions используется
для регистрации замыкания, которое определяет, как конкретное
исключение должно быть преобразовано в HTTP-ответ.
Метод принимает два параметра: класс исключения и замыкание,
которое возвращает экземпляр Response.
Это позволяет централизованно управлять отображением ошибок
в приложении, не дублируя логику в каждом обработчике.
Синтаксис
<?php
$this->renderable(ExceptionClass::class, function (Exception $e, Request $request) {
return response()->view('errors.custom', ['exception' => $e], 500);
});
?>
Пример 1
Зарегистрируем пользовательский рендеринг для исключения
ModelNotFoundException в файле App\Exceptions\Handler:
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Throwable;
class Handler extends ExceptionHandler
{
public function register()
{
$this->renderable(function (ModelNotFoundException $e, $request) {
if ($request->expectsJson()) {
return response()->json([
'error' => 'Resource not found',
'message' => $e->getMessage(),
], 404);
}
return response()->view('errors.404', [], 404);
});
}
}
?>
Пример 2
Используем renderable для кастомизации отображения
исключения валидации:
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Validation\ValidationException;
use Throwable;
class Handler extends ExceptionHandler
{
public function register()
{
$this->renderable(function (ValidationException $e, $request) {
if ($request->expectsJson()) {
return response()->json([
'status' => 'error',
'errors' => $e->errors(),
], 422);
}
return redirect()->back()
->withErrors($e->errors())
->withInput();
});
}
}
?>
Результат выполнения кода при AJAX-запросе:
{
"status": "error",
"errors": {
"email": [
"The email field is required."
]
}
}
Пример 3
Обработаем исключение AccessDeniedHttpException
с перенаправлением на страницу входа:
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Throwable;
class Handler extends ExceptionHandler
{
public function register()
{
$this->renderable(function (AccessDeniedHttpException $e, $request) {
if ($request->expectsJson()) {
return response()->json([
'error' => 'Forbidden',
'message' => 'You do not have permission to access this resource.',
], 403);
}
return redirect()->route('login')
->with('error', 'Please login to access this page.');
});
}
}
?>
Пример 4
Кастомизируем отображение исключения QueryException
для возврата дружественного сообщения в продакшене:
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Database\QueryException;
use Throwable;
class Handler extends ExceptionHandler
{
public function register()
{
$this->renderable(function (QueryException $e, $request) {
if (app()->environment('production')) {
if ($request->expectsJson()) {
return response()->json([
'error' => 'Database error',
'message' => 'An error occurred while processing your request.',
], 500);
}
return response()->view('errors.database', [], 500);
}
return response()->view('errors.database', [
'error' => $e->getMessage(),
], 500);
});
}
}
?>
Смотрите также
-
метод
render,
который преобразует исключение в HTTP-ответ -
метод
reportable,
который регистрирует пользовательскую логику отчета об исключении -
метод
shouldReport,
который определяет, должно ли исключение быть зарегистрировано -
класс
Handler,
который управляет всеми исключениями в приложении