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());
}