Метод shouldRenderJsonWhen
Метод shouldRenderJsonWhen применяется к объекту исключения
и возвращает логическое значение (true или false),
указывающее, должен ли ответ на данное исключение быть
отрендерен в формате JSON. Этот метод полезен при создании
API, когда необходимо гибко управлять форматом ответа
в зависимости от типа исключения или контекста запроса.
Синтаксис
<?php
$exception->shouldRenderJsonWhen($request);
?>
Метод принимает один параметр - объект запроса (Request).
По умолчанию метод возвращает true, если запрос ожидает
JSON-ответ (например, через заголовок Accept: application/json
или если это API-запрос). Однако вы можете переопределить
это поведение в собственном классе исключения.
Пример
Давайте создадим собственное исключение, которое всегда возвращает JSON-ответ, независимо от заголовков запроса:
<?php
namespace AppExceptions;
use Exception;
use IlluminateHttpRequest;
class ApiException extends Exception
{
public function shouldRenderJsonWhen(Request $request): bool
{
return true;
}
}
?>
Результат выполнения кода:
true
Пример
Теперь создадим исключение, которое возвращает JSON-ответ только для запросов с определённым заголовком:
<?php
namespace AppExceptions;
use Exception;
use IlluminateHttpRequest;
class CustomException extends Exception
{
public function shouldRenderJsonWhen(Request $request): bool
{
return $request->header('X-Requested-With') === 'XMLHttpRequest';
}
}
?>
Результат выполнения кода для разных запросов:
// Для обычного запроса: false
// Для AJAX-запроса: true
Пример
Использование метода в обработчике исключений для гибкого управления форматом ответа:
<?php
namespace AppExceptions;
use IlluminateFoundationExceptionsHandler as BaseHandler;
use Throwable;
use IlluminateHttpRequest;
class Handler extends BaseHandler
{
public function render($request, Throwable $exception)
{
if ($exception instanceof ApiException) {
return response()->json([
'error' => $exception->getMessage(),
'code' => $exception->getCode()
], 400);
}
if ($exception instanceof CustomException && $exception->shouldRenderJsonWhen($request)) {
return response()->json([
'error' => 'Custom error message'
], 403);
}
return parent::render($request, $exception);
}
}
?>
Результат выполнения кода:
// Для ApiException: {"error": "...", "code": ...}
// Для CustomException с AJAX-запросом: {"error": "Custom error message"}
Смотрите также
-
метод
render,
который отвечает за рендеринг исключения в HTTP-ответ -
метод
respond,
который используется для формирования ответа на исключение -
класс
Handler,
который является центральным обработчиком исключений в Laravel -
исключение
HttpException,
которое является базовым для всех HTTP-исключений