Laravel пропонує елегантне рішення для трансформації API-ресурсів завдяки впровадженню флюентних методів. Ці інтуїтивні доповнення забезпечують більш природний процес кодування при перетворенні моделей Eloquent в API-ресурси.
Під час розробки API з Laravel перетворення моделей Eloquent на стандартизовані відповіді ресурсів є поширеною вимогою. Традиційний підхід передбачає обгортання моделей у класах ресурсів:
UserResource::make(User::find(1));
UserResource::collection(User::query()->active()->paginate());
Хоча цей метод працює, він створює розрив між отриманням моделей і їх трансформацією. Двоступеневий процес потребує зміни мислення, оскільки потрібно переходити від отримання даних до їх форматування, що ускладнює сприйняття коду.
Нові флюентні методи Laravel усувають цю проблему, прив'язуючи можливості трансформації безпосередньо до моделей Eloquent та колекцій:
User::find(1)->toResource(UserResource::class);
User::query()->active()->paginate()->toResourceCollection(UserResource::class);
Таке рішення створює природний потік від отримання моделі до її трансформації, дозволяючи коду читатися зліва направо в одній логічній послідовності.
Фреймворк також пропонує автоматичне визначення ресурсів на основі послідовності імен:
User::find(1)->toResource();
Коли ви викликаєте toResource() без аргументів, Laravel автоматично шукає клас ресурсу, що відповідає шаблону імен вашої моделі. Якщо ваша модель - Product, Laravel шукатиме ProductResource. Цей підхід «конвенція над конфігурацією» зменшує обсяг коду, зберігаючи його зрозумілість.
В практичному контролері API поліпшення стає відчутним:
class ProductController extends Controller
{
public function show($id)
{
// До:
// return ProductResource::make(Product::findOrFail($id));
// Після:
return Product::findOrFail($id)->toResource();
}
public function index(Request $request)
{
$products = Product::query()
->when($request->has('featured'), fn($query) => $query->featured())
->when($request->has('category'), fn($query) => $query->where('category_id', $request->category))
->latest()
->paginate();
// До:
// return ProductResource::collection($products);
// Після:
return $products->toResourceCollection();
}
}
Флюентний підхід формує код, що відповідає природним процесам мислення: "Отримай цей продукт і перетвори його на ресурс." Це робить код більш читабельним і легшим для обслуговування як для вас, так і для вашої команди