Laravel Resource Controller

Penggunaan proses Create, Read, Update, dan Delete pada suatu resource merupakan salah satu fitur yang selalu ada pada kebanyakan aplikasi. Hal ini memaksa kita sebagai developer untuk terus melakukan hal yang sama - membuat route untuk CRUD, membuat beberapa method pada controller dan hal lainnya.

Tahukah kalau Laravel menyediakan cara yang lebih cepat? Dengan menggunakan Laravel resource controller, kita hanya perlu memanggil satu perintah saja untuk membuat controller dan satu baris kode untuk route-nya.

Tutorial kali ini akan membahas penggunaan Laravel resource controller untuk memudahkan kita dalam membuat aplikasi CRUD. Walaupun sebelumnya saya telah membuat tutorial untuk membuat aplikasi CRUD Laravel, tutorial ini akan memperjelas penggunaan Resource Controller-nya.

Apa saja yang akan kita bahas?
  • Apa itu Laravel Resource Controller
  • Laravel Resource Controller dengan Model
  • Laravel Resource Controller untuk API
Oke mari kita mulai! 

Apa itu Laravel Resource Controller? 

Laravel Resource Controller adalah fitur di Laravel yang berguna untuk memudahkan kita membuat routing untuk CRUD pada controller dengan menggunakan satu perintah saja. 

Contoh Laravel Resource Controller adalah ketika kita ingin membuat CRUD untuk satu resource. Misalnya CRUD buku. kita hanya perlu menggunakan perintah berikut:

php artisan make:controller BukuController --resource

Tambahan --resource pada perintah diatas berguna untuk membuat reosurce controller. Jika kita lihat pada file controller yang telah digenerate maka kita akan melihat beberapa method yang telah dibuat otomatis oleh Laravel.

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;

class BukuController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}

Terlihat bahwa Laravel telah menambahkan beberapa method yang bisa langsung kita gunakan untuk membuat CRUD dengan penamaan method yang sangat rapi.

  1. Method index() digunakan untuk menampilkan tabel keseluruhan data (Read). Sedangkan method show() digunakan untuk menampilkan data secara individu atau detail datanya (Read).
  2. Method create() digunakan untuk menampilkan form pembuatan data, sedangkan method store() digunakan untuk memasukkan data dari form ke database (Create).
  3. Method edit() digunakan untuk menampilkan form ubah data, sedangkan method update() digunakan untuk mengubah data yang dimasukkan dari form ke database (Update).
  4. Method destroy() tentunya digunakan untuk menghapus data (Delete).

Untuk menggunakan rangkaian method tersebut, kita hanya perlu menggunakan satu baris kode saja pada route.

Route::resource('buku', 'BukuController');

Route::resource akan secara otomatis membuatkan route untuk semua method yang ada pada controller. Untuk melihat route apa saja yang dibuat oleh kode diatas dapat dengan memanggil perintah berikut pada terminal.

php artisan route:list

Perintah itu akan menampilkan list route yang kurang lebih isinya seperti ini.

HTTP verb| Path (URL)| Action (Method)| Route Name
GET| /buku| index| buku.index
GET| /buku/create| create| buku.create
POST| /buku| store| buku.store
GET| /buku/{$id}| show| buku.show
GET| /buku/{$id}/edit| edit| buku.edit
PUT/PATCH| /buku/{$id}| update| buku.update
DELETE| /buku/{$id}| destroy| buku.destroy

Terlihat bahwa route resource lebih cepat jika kita perlu membuat CRUD dalam sebuah aplikasi. Namun bagaimana jika kita hanya membutuhkan beberapa route saja?

Laravel telah menyediakan solusinya dengan menggunakan partial resource, dimana kita bebas memilih method apa saja yang akan kita gunakan atau tidak kita gunakan.

Route::resource('buku', 'BukuController', [

    'only' => ['create', 'store', 'show']

]);

only dapat kita gunakan jika kita membutuhkan method tertentu saja. Dalam contoh diatas, Laravel hanya akan menyediakan route untuk method create(), store() dan show() saja.

Route::resource('user', 'UserController', [

    'except' => ['destroy']

]);

Kebalikan dari only, except dapat kita gunakan untuk menghilangkan route yang tidak kita butuhkan. Dalam contoh diatas Laravel akan menghapus method destroy() dari route.

Lalu bagaimana jika kita ingin menambahkan route lain ke route resource yang sudah ada?

Misalkan kita memerlukan route untuk method restore(). Maka kita dapat menambahkannya dengan cara seperti ini.

Route::match(['put', 'patch'], 'buku/{$id}/restore', 'BukuController@restore');

Route::resource('buku', 'BukuController'); // Route resource default

Laravel Resource Controller dengan Model 

Terkadang dalam melempar variabel ke route, kita tidak ingin menggunakan {$id} melainkan menggunakan modelnya secara langsung.

Hal ini dapat dilakukan dengan menggunakan Laravel Route Model Binding seperti yang sudah pernah saya bahas sebelumnya.

Lalu bagaimana cara mengkombinasikannya dengan Laravel Resource Controller ini? Cukup mudah, gunakan perintah dibawah untuk generate controller yang support Laravel Route Model Binding.

php artisan make:controller BukuController --resource --model=Buku

Penambahan opsi --model pada perintah diatas, secara otomatis akan menggunakan metode Route Model Binding pada route list-nya nanti.

Laravel Resource Controller untuk API

Penggunaan route biasa dan route untuk API memiliki sejumlah perbedaan. Nah, bagaimana kalau yang kita butuhkan adalah route untuk API?

Tentunya kita tidak membutuhkan method create() dan edit() yang hanya berfungsi untuk menampilkan form. Sebenarnya kita bisa menggunakan only dan except seperti contoh diatas. Namun Laravel punya cara yang lebih baik.

Route::apiResource('user', 'UserController');

Dengan menggunakan Route::apiResource maka Laravel akan melakukan generate untuk route yang hanya diperlukan untuk API.

Kesimpulan

Pada tutorial ini, kita telah belajar penggunaan Laravel Resource Controller dengan lebih spesifik. Untuk implementasi yang sesungguhnya dalam membuat aplikasi CRUD di Laravel, sudah saya sediakan tutorialnya tersendiri.

Semoga tutorial ini dapat memperjelas penggunaan Laravel Resource Controller. Apalagi mengingat fitur ini akan banyak digunakan pada aplikasi web yang membutuhkan banyak CRUD.

Semoga bisa bermanfaat, jangan lupa terus ngoding!