Blog FQSoft

Just Simple Code Documentation

PHP Laravel

RESTful API Dengan Resources Collection di Laravel

Faiq Himmah 23 December 2023
[ Gambar Post ]

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 PegawaiCollection

Dari 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
laravel Restful api Collection