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

Show Comments