Найпростіше - повернути масив або модель: Laravel сам віддасть JSON із правильним заголовком.
public function show(Post $post)
{
return $post; // JSON усієї моделі
}
public function stats()
{
return ['total' => Post::count()]; // JSON масиву
}
Чому цього замало. Модель віддає всі свої поля, тож у відповідь потрапляє те, чого там бути не повинно, а перейменування колонки мовчки змінює формат API для всіх клієнтів.
API Resource - це шар між моделлю та JSON, який описує форму відповіді явно:
php artisan make:resource PostResource
class PostResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'published_at' => $this->published_at?->toIso8601String(),
'author' => new UserResource($this->whenLoaded('author')),
];
}
}
Використання:
public function show(Post $post)
{
return new PostResource($post);
}
public function index()
{
return PostResource::collection(Post::paginate());
}
collection() разом із пагінацією сам додає блоки links і meta.
Що це дає: структура відповіді описана в одному місці, поля з бази не протікають назовні, дати мають єдиний формат, а whenLoaded() додає звʼязок лише тоді, коли його справді завантажили - і тим самим не створює N+1.