JsonApiResource формує відповіді за специфікацією JSON:API, тож структуру не треба писати вручну.
php artisan make:resource PostResource --json-api
class PostResource extends JsonApiResource
{
public $attributes = ['title', 'body', 'created_at'];
public $relationships = ['author', 'comments'];
}
Що ресурс робить сам:
- структура
dataзtype,id,attributes,relationships; includedдля запитаних зв'язків - кожен об'єкт один раз, навіть якщо на нього посилаються кілька записів;- розріджені набори полів:
?fields[posts]=title,created_at- лише потрібні атрибути; - включення:
?include=author- зв'язки потрапляють у відповідь лише на запит; - заголовок
Content-Type: application/vnd.api+json.
Що він не робить: не розбирає фільтри й сортування з запиту - для цього документація радить spatie/laravel-query-builder.
Коли обирати: коли клієнти (мобільні застосунки, сторонні інтеграції, фронтенд з бібліотекою під JSON:API) виграють від стандартного формату й керування полями. Для внутрішнього API одного фронтенду звичайні ресурси простіші.
Пам'ятати про N+1: include з запиту має відповідати жадібному завантаженню в контролері; includePreviouslyLoadedRelationships() віддає вже завантажені зв'язки й без параметра.