RESTful API Dengan Resource di Laravel

Tutorial ini ditulis berdasarkan dokumentasi laravel versi 10
Pada prinsipnya Restful API pada laravel adalah mengubah Eloquent Models atau data-data yang direquest menjadi data berformat JSON (Javascript Object Notation).
Untuk saat ini layanan berbagi data antar aplikasi atau antar website kebanyakan menggunakan data berformat JSON. Dimana sebelumnya pertukaran data dilakukan dengan format XML
Pertama-tama kita harus membuat file resource yang berfungsi untuk mengubah setiap data menjadi JSON
php artisan make:resource PegawaiResourceDengan perintah diatas akan menghasilkan file PegawaiResource.php di folder app/Http/Resources . secara default file PegawaiResource.php seperti dibawah ini dengan extends JsonResource :
class PegawaiResource extends JsonResource
{
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}Jika hendak meng-custome isi dari function toArray bisa melihat contoh dibawah ini :
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,//new KotakResource(Kotak::findOrFail($this->kotak)),
'email' => $this->email,
'divisi' => new DivisiResource(Divisi::findOrFail($this->divisi))
];
}Pada contoh diatas. kita melakukan custom untuk menentukan data-data apa saja yang dapat di request. Dan setiap key menggunakan pointer $this untuk mengisi datanya. dan $this ini merujuk pada nama kolom di tabel Pegawai
Untuk key 'divisi' agak berbeda dengan yang lain karena output yang dibutuhkan tidak hanya menghasilkan ID Divisi tapi juga seluruh data Divisi misal nama divisinya. Jika masih bingung 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::findOrFail(1);
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"
}
}
}terlihat bahwa key 'divisi' tidak hanya menampikan ID Divisi tapi juga objek dari divisi. Untuk meng-custom isi dari data divisi. maka bisa mengubah isi dari file DivisiResource.php dengan cara yang sama pada file PegawaiResource.php
Semoga Bermanfaat dan Terima Kasih...
Refrensi : Eloquent: API Resources - Laravel 10.x - The PHP Framework For Web Artisans
Tambahan
Bagaimana jika ingin menghasilkan output lebih dari satu data ?
Caranya dengan menambahkan function collection() . Karena function collection() dipanggil secara static maka pemanggilannya tanpa keyword new
Route::get('pegawai', function () {
$model = Pegawai::all();
return PegawaiResource::collection($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"
}
}
]
}Maka terlihat perbedaanya dimana untuk key 'data' berupa array JSON
Bagaimana cara menambahkan link pagination ?
Caranya dengan memanggil function paginate()
Route::get('pegawai', function () {
$model = Pegawai::paginate(5);
return PegawaiResource::collection($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