RESTful API Dengan Resources Collection di Laravel

Tutorial ini ditulis berdasarkan dokumentasi laravel versi 10
Pada prinsipnya perbedaan Resource dan Resource Collection secara default outputnya adalah :
- Resource : menghasilkan Object JSON
- Resource Collection : menghasilkan Array JSON
Namun Resource memiliki kelebihan bisa menghasilkan output berupa Array JSON. Untuk caranya bisa Baca Disini : Membuat Restful API di Laravel Menggunakan Resources . hal ini tidak berlaku sebaliknya bagi Resource Collection
Oleh karenanya jika sejak awal dan bisa diperkirakan hingga kedepan request yang diperlukan hanya berupa array JSON, maka disarankan menggunakan Resource Collection
Pertama-tama kita harus membuat file resource collection yang berfungsi untuk mengubah setiap data menjadi Array JSON
php artisan make:resource PegawaiCollectionDari perintah diatas akan menghasilkan file PegawaiCollection.php pada folder app/Http/Resources . secara default file tersebut berisi seperti dibawah ini dan extends dari class ResourceCollection
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\ResourceCollection;
class PegawaiCollection extends ResourceCollection
{
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}
kita akan coba test hasilnya. Sebelum itu kita buat dulu router untuk test api di file api.php yang terletak di routes/api.php.
Route::get('pegawai', function () {
$model = Pegawai::all();
return new PegawaiResource($model);
});Jalankan server laravel dengan menjalan php artisan serve. dan jalankan di browser secara default adalah http://127.0.0.1/api/pegawai. Dan jika tidak ada kendala outptunya seperti dibawah ini
"data": [
{
"id": 1,
"name": "Ahmad",
"email": "ahmad@mail.com",
"divisi" : {
"id": 5,
"name": "Quality Control"
}
},
{
"id": 2,
"name": "Yusuf",
"email": "yusuf@mail.com",
"divisi" : {
"id": 4,
"name": "Development"
}
},
{
"id": 1,
"name": "Sulaiman",
"email": "sulaiman@mail.com",
"divisi" : {
"id": 3,
"name": "Marketing"
}
}
]Jika ingin meng-custom response data yang diberikan maka silahkan ubah isi function toArray. seperti contoh dibawah ini :
public function toArray(Request $request): array
{
return [
'data' => $this->collection,
'links' => [
'self' => 'link-value',
],
];
}Untuk melihat hasilnya coba jalankan di browser
"data": [
{
"id": 1,
"name": "Ahmad",
"email": "ahmad@mail.com",
"divisi" : {
"id": 5,
"name": "Quality Control"
}
},
{
"id": 2,
"name": "Yusuf",
"email": "yusuf@mail.com",
"divisi" : {
"id": 4,
"name": "Development"
}
},
],
"links": {
"self": "link-value"
}Terlihat ada key baru yaitu "links"
Semoga Bermanfaat dan Terima Kasih…
Refrensi : Eloquent: API Resources - Laravel 10.x - The PHP Framework For Web Artisans
Tambahan
Bagaimana cara menambahkan link pagination ?
Caranya dengan memanggil function paginate()
Route::get('pegawai', function () {
$model = Pegawai::paginate(5);
return new PegawaiCollection($model);
});Coba lakukan test di browser dengan url http://127.0.0.1/api/pegawai
{
"data": [
{
"id": 1,
"name": "Ahmad",
"email": "ahmad@mail.com",
"divisi" : {
"id": 5,
"name": "Quality Control"
}
},
{
"id": 2,
"name": "Yusuf",
"email": "yusuf@mail.com",
"divisi" : {
"id": 4,
"name": "Development"
}
},
{
"id": 1,
"name": "Sulaiman",
"email": "sulaiman@mail.com",
"divisi" : {
"id": 3,
"name": "Marketing"
}
}
],
"links": {
"first": "http://127.0.0.1:8000/api/kotak-semua?page=1",
"last": "http://127.0.0.1:8000/api/kotak-semua?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "http://127.0.0.1:8000/api/pegawai?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "http://127.0.0.1:8000/api/pegawai",
"per_page": 5,
"to": 4,
"total": 4
}
}dari output diatas terlihat ada dua key baru selain key ‘data’ yaitu :
- links : berisi link pagination
- meta : berisi informasi pagination