Menggunakan Laravel Resource
Saat membuat API biasanya kita akan menerapkan aturan mengenai output yang akan dihasilkan oleh request. Misal jika saya memiliki model Book
dan Author
dan saya ingin menerapkan output seperti berikut
{
"id": 1,
"title": "lorem",
"description": "Lorem Ipsum.",
"author": "Mr. John Doe."
},
Biasanya proses pembentukan dilangsungkan di controller
seperti berikut
$model = Book::with('author')->get();
foreach($model as $row) {
$data[] = [
"id"=>$row->id,
"title"=>$row->title,
"description"=>$row->description,
"author"=>$row->author->name
];
}
return [
"data"=>$data
];
Hasilnya
"data": [
{
"id": 1,
"title": "repellat",
"description": "Qui odit libero delectus sint et. Quia quia enim placeat dolor deleniti.",
"author": "Mohammed Ernser"
},
{
"id": 2,
"title": "in",
"description": "Est harum facere possimus laudantium totam provident est. Ea ea laudantium cum repellendus et enim.",
"author": "Mrs. Estella Sporer"
},
{
"id": 3,
"title": "rerum",
"description": "Ea illo necessitatibus maxime. Quis et voluptas aut at.",
"author": "Mohammed Ernser"
},
{
"id": 4,
"title": "cum",
"description": "Soluta illum totam occaecati occaecati. Doloribus illo animi et beatae ut velit.",
"author": "Mrs. Estella Sporer"
},
{
"id": 5,
"title": "iste",
"description": "Quia ea repudiandae et enim quia itaque. Voluptatem voluptate ducimus qui fugit autem corporis.",
"author": "Mohammed Ernser"
}
]
}
Itu tidak salah tentunya, tapi ada cara yang lebih enak ( setidaknya bagi saya ) untuk menerapkan output yang sama namun lebih mudah dirawat kedepannya, yaitu menggunakan Resources
.
Membuat Resources
Untuk membuat resources
gunakan perintah berikut
php artisan make:resource BookResource
Perintah di atas akan membuat berkas BookResource
di folder app/Http/Resources
.
Di dalamnya kita ubah menjadi seperi ini
public function toArray($request)
{
return [
"id"=>$this->id,
"title"=>$this->title,
"description"=>$this->description,
"author"=>$this->author->name
];
}
Sedangkan di controller
kita tambahkan resource
ke dalamnya
use App\Http\Resources\BookResource;
//fungsi yang tadi ubah menjadi
$model = Book::with('author')->get();
return BookResource::collection($model);
Hasilnya
{
"data": [
{
"id": 1,
"title": "repellat",
"description": "Qui odit libero delectus sint et. Quia quia enim placeat dolor deleniti.",
"author": "Mohammed Ernser"
},
{
"id": 2,
"title": "in",
"description": "Est harum facere possimus laudantium totam provident est. Ea ea laudantium cum repellendus et enim.",
"author": "Mrs. Estella Sporer"
},
{
"id": 3,
"title": "rerum",
"description": "Ea illo necessitatibus maxime. Quis et voluptas aut at.",
"author": "Mohammed Ernser"
},
{
"id": 4,
"title": "cum",
"description": "Soluta illum totam occaecati occaecati. Doloribus illo animi et beatae ut velit.",
"author": "Mrs. Estella Sporer"
},
{
"id": 5,
"title": "iste",
"description": "Quia ea repudiandae et enim quia itaque. Voluptatem voluptate ducimus qui fugit autem corporis.",
"author": "Mohammed Ernser"
}
]
}
Hasilnya sama kan ? Bahkan dengan coding yang lebih sedikit di controller. Nah kalau mau digunakan untuk detail bukan daftar array seperti di atas kita bisa gunakan cara seperti ini
$model = Book::with('author')->find(1);
return new BookResource($model);
Hasilnya
{
"data": {
"id": 1,
"title": "repellat",
"description": "Qui odit libero delectus sint et. Quia quia enim placeat dolor deleniti.",
"author": "Mohammed Ernser"
}
}
Kesimpulan
Ada beberapa keuntungan yang saya rasakan saat menggunakan Resources
1. Coding Controller
lebih rapi.
2. Output yang konsisten.
3. Mudah dirawat jika output yang sama diterapkan di banyak tempat. Cukup ubah Resource
-nya, detail maupun list hasilnya akan sama.
Referensi :
https://laravel.com/docs/5.5/eloquent-resources