Laravel Lumen Обеспечить ответ JSON
Я новичок в Ларавеле и Люмене. Я хочу, чтобы я всегда получал только объект JSON в качестве вывода. Как я могу это сделать в Люмене?
Я могу получить ответ JSON, используя response()->json($response);
, Но когда возникает ошибка, API дает мне text/html
ошибки. Но я хочу только ответы application/json
.
Заранее спасибо.
Ответы
Ответ 1
Вам нужно настроить обработчик исключений (app/Exceptions/Handler.php
), чтобы он возвращал нужный ответ.
Это очень простой пример того, что можно сделать.
public function render($request, Exception $e)
{
$rendered = parent::render($request, $e);
return response()->json([
'error' => [
'code' => $rendered->getStatusCode(),
'message' => $e->getMessage(),
]
], $rendered->getStatusCode());
}
Ответ 2
Более точное решение, основанное на ответе @Wader, может быть:
use Illuminate\Http\JsonResponse;
public function render($request, Exception $e)
{
$parentRender = parent::render($request, $e);
// if parent returns a JsonResponse
// for example in case of a ValidationException
if ($parentRender instanceof JsonResponse)
{
return $parentRender;
}
return new JsonResponse([
'message' => $e instanceof HttpException
? $e->getMessage()
: 'Server Error',
], $parentRender->status());
}
Ответ 3
Как ответ MTVS, вы даже можете использовать класс JsonResponse для форматирования ответа и использовать его как статический член из метода render, не импортируя его в пространство имен Handler следующим образом:
public function render($request, Exception $e)
{
$parentRender = parent::render($request, $e);
// if parent returns a JsonResponse
// for example in case of a ValidationException
if ($parentRender instanceof \Illuminate\Http\JsonResponse)
{
return $parentRender;
}
return new \Illuminate\Http\JsonResponse([
'message' => $e instanceof HttpException
? $e->getMessage()
: 'Server Error',
], $parentRender->status());
}