Если у вас есть достаточно сложное приложение на Laravel, скорее всего в вашем проекте используется API.

Когда реализовываешь такое API то возникает проблема: как сделать JSON ответ для API?

Если вы уже хорошо знаете что такое API, то пропускайте предисловие и переходите сразу к решению в конце статьи.

Для чего нужен API в приложении?

Есть несколько применений для API:

  • Разделение Frontend и Backend вашего сайта, например при использовании Frontend фреймворков Vue, React, или даже без них. В этом случае API будет предоставлять вашему фронтенду все необходимые данные и обслуживать действия пользователя на сайте.
  • API для мобильного приложения: аналогично предыдущему, только фронтендом является мобильное приложение, а не страница сайта.
  • Third-party интеграция: если вы даёте другим разработчикам возможность интегрироваться с вашей системой.
  • Обработка колбеков: при интеграции с такими внешними системами как CRM или платёжными шлюзами, может потребоваться обновлять данные на сайте по входящему HTTP запросу.

И так далее.

Формат API

Самым распространённым вариантом для формата API в 2024 году является JSON и HTTP.

Это универсальные форматы, которые понятны большинству существующих систем, а потому и подключаемые чаще и проще остальных.

Как подключить API в Laravel

До версии Laravel 10 включительно в шаблон стандартного приложения уже было включено настроенное API.

Но начиная с версии Laravel 11 это изменили. Теперь “из коробки” в приложении нет API.

Подключить его можно командой:

php artisan install:api

Как настроить JSON ответ в API

Если не настроить JSON формат ответа API, то при ошибке со стороны клиента API в ответ вывалится невнятная “портянка” из HTML тегов.

Это не смертельно, но неприятно.

Причина в том, что Laravel не отдаёт при ошибке ответ JSON если не указан заголовок:

Accept: application/json

Гораздо логичнее отдавать ответ с API в формате JSON всегда, если не указано обратное.

Laravel этого делать не умеет, но можно это пофиксить самостоятельно.

Шаг 1. Создаём Middleware

app/Http/Middleware/ForceJsonResponseMiddleware.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

/**
 * App/Http/Kernel
 *
 * 'api' => [
 *            ForceJsonResponseMiddleware::class,
 *            ...
 *          ],
 */
class ForceJsonResponseMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        $request->headers->set('Accept', 'application/json');

        return $next($request);
    }
}

Шаг 2. Регистрируем Middleware в приложении

app/Http/Kernel.php

<?php

namespace App\Http;

...

class Kernel extends HttpKernel
{
    ...
    
    protected $middlewareGroups = [
        ...

        'api' => [
            ForceJsonResponseMiddleware::class,
            ...
        ],
    ];

	...
}

Теперь в каждый запрос к API будет добавлен заголовок “Accept: application/json”, и ответ будет всегда в формате JSON.