Blog FQSoft

Just Simple Code Documentation

PHP Laravel

RESTful API Dengan Resource di Laravel

Faiq Himmah 23 December 2023
[ Gambar Post ]

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 PegawaiResource

Dengan 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

laravel Restful api