API Resources в Laravel надають елегантні способи умовного включення атрибутів у ваші відповіді, що дозволяє створювати гнучкі та ефективні API, які адаптуються до різних контекстів і дозволів
Створюючи API, часто виникає потреба кастомізувати відповіді залежно від сценаріїв — наприклад, показувати певні поля лише адміністраторам, передавати супутні дані лише на запит або змінювати формат відповіді залежно від ендпоінту. API Resources в Laravel забезпечують потужні методи для вирішення цих завдань через умовні атрибути
Серед основних доступних методів:
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->when($request->user()->isAdmin(), $this->email),
];
}
}
Розглянемо практичний приклад API для каталогу продуктів з умовними даними:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'slug' => $this->slug,
'price' => $this->price,
// Включати повний опис лише в детальному перегляді
'description' => $this->when(
$request->route()->named('products.show'),
$this->description,
$this->excerpt
),
// Включати інформацію про товар на складі для автентифікованих користувачів
'stock_level' => $this->when(
$request->user()?->can('view-inventory'),
$this->stock_count
),
// Включати зв'язки, коли вони завантажені
'category' => new CategoryResource($this->whenLoaded('category')),
// Умовно включати кількість відгуків
'reviews_count' => $this->when(
$request->include_counts,
$this->reviews_count
),
// Включати дані для адміністраторів
'profit_margin' => $this->when(
$request->user()?->isAdmin(),
fn() => $this->calculateProfitMargin()
),
];
}
}
Умовні атрибути Laravel в API Resources дозволяють створювати контекстно-залежні відповіді, зберігаючи ваш код чистим і зручним для підтримки