არ დააბრუნოთ raw Eloquent დატა API response-ში. ყოველთვის გამოიყენეთ API რესურსები.
API რესურსი არის transformation layer თქვენს Eloquent models-სა და JSON response-ს შორის.
წარმოიდგინეთ, რომ თქვენი database არის სამზარეულო, სადაც ნედლი პროდუქტებია (raw data). API Resource არის მზარეული, რომელიც ამ პროდუქტებს ამზადებს და ლამაზად წარმოადგენს სტუმრებისთვის.
Laravel-ში (და API-ებში ზოგადად), raw models/arrays-ის დაბრუნება მუშაობს, მაგრამ API Resources-ის გამოყენება ითვლება საუკეთესო პრაქტიკად რამდენიმე მიზეზის გამო.
1. თქვენ აკონტროლებთ რა გადის თქვენი სისტემიდან
Raw Eloquent მოდელი ყველაფერს შეიცავს, რისგანაც იგი შედგება.
როდესაც model-ს აბრუნებთ, თქვენ აბრუნებთ ყველაფერს, რაც იმ მომენტში ჩატვირთულია. ეს ნიშნავს, რომ database სტრუქტურა, internal ველები და მომავალში დამატებული ქოლუმნები შეიძლება "გაიპაროს" response-ში. ერთმა დამატებულმა column-მა ან relationship-მა შეიძლება ჩუმად შეცვალოს თქვენი API output.
Resource-ის შექმნა
ეს შექმნის ფაილს: app/Http/Resources/UserResource.php
როგორ გამოიყურება რესურსის კლასი:
მაგალითი
შეჯამება ერთ წინადადებაში
API რესურსი არის კონტრაქტი თქვენს database-სა და გარე სამყაროს შორის — უსაფრთხო, სტაბილური და კონტროლირებადი.
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
/**
* გარდაქმნის model-ს array-ში.
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'joinedDate' => $this->created_at->format('d.m.Y'),
// Conditional field - მხოლოდ admin-ებს უჩანთ
'role' => $this->when($request->user()->isAdmin(), $this->role),
];
}
}
// ❌ ცუდი
return User::find($id);
// აბრუნებს: id, name, email, password (თუ hidden არ არის მოდელის კლასში), remember_token, created_at, updated_at,
// და ნებისმიერ სხვა column-ს რაც დაამატეთ
// ✅ კარგი
return new UserResource(User::find($id));
class UserResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
// მხოლოდ ეს - არაფერი მეტი, არაფერი ნაკლები
];
}
}