Memanfaatkan Fitur Resource Controller Laravel

Di Laravel, kita bisa membuat controller baru dengan perintah php artisan make:controller SampleController. Tahukah kalian, kalau perintah make:controller ini dapat menerima opsi --resource?

$ php artisan make:controller UserController --resource

Dengan menambahkan opsi --resource, maka controller yang telah dibentuk (secara default), diisi dengan delapan method yang digunakan untuk operasi CRUD (Create, Read, Update, Delete).

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController 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)
    {
        //
    }
}

Method create() digunakan untuk menampilkan form, sedangkan store() digunakan untuk proses penyimpanan data. Sama seperti edit() yang digunakan untuk menampilkan form, method update() juga digunakan untuk proses pembaruan data.

Untuk menggunakan resource controller di atas, kalian hanya perlu mendaftarkannya pada route.

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

Argumen pertama pada method resource() berfungsi untuk mendefinisikan prefix di URL. Sedangkan argumen kedua pada method tersebut cukup ditulis nama controller-nya saja, tanpa diikuti nama method.

Jika dilihat melalui Artisan, maka akan kita lihat beberapa route yang terbentuk.

$ php artisan route:list | grep user
|        | GET|HEAD  | user             | user.index   | App\Http\Controllers\UserController@index   | web          |
|        | POST      | user             | user.store   | App\Http\Controllers\UserController@store   | web          |
|        | GET|HEAD  | user/create      | user.create  | App\Http\Controllers\UserController@create  | web          |
|        | GET|HEAD  | user/{user}      | user.show    | App\Http\Controllers\UserController@show    | web          |
|        | PUT|PATCH | user/{user}      | user.update  | App\Http\Controllers\UserController@update  | web          |
|        | DELETE    | user/{user}      | user.destroy | App\Http\Controllers\UserController@destroy | web          |
|        | GET|HEAD  | user/{user}/edit | user.edit    | App\Http\Controllers\UserController@edit    | web          |

Model Spesifik

Jika kalian perhatikan, terdapat parameter $id pada setiap method di resource controller. Dari variabel $id ini, kalian perlu melakukan pencarian terhadap data yang ingin ditampilkan atau diproses.

Langkah ini sebenarnya bisa dioptimasi lagi dengan menggunakan fitur model binding di Laravel. Dengan integrasi resource controller dengan model binding, tentunya skrip bakal jauh lebih sederhana.

Baca juga: Model Binding di Laravel.

Sebagai contoh, kita ingin membuat resource controller dengan model App\User (model yang berada di direktori app).

$ php artisan make:controller UserController --resource --model=User

// dalam sub direktori
$ php artisan make:controller PenggunaController --resource --model=Models/Pengguna

Dengan menambahkan opsi --model, kalian juga akan mendapati dialog untuk membuat model baru pada path yang didefinisikan. Tentunya, opsi pembuatan model baru ini hanya ada jika model yang kalian definisikan belum ada pada aplikasi.

Partials Resource

Dalam dunia nyata, tidak semua data butuh operasi CRUD. Ada beberapa operasi yang mungkin bisa saja dihilangkan dari fitur.

Resource controller mendukung fitur untuk memberikan pengecualian untuk resource apa saja yang akan digunakan. Yang perlu dilakukan hanya menambahkan opsi only pada definisi route. Sebagai contoh, pada sebuah resource saya hanya menggunakan method create() dan store() pada controller.

Route::resource('user', 'UserController', [
    'only' => ['create', 'store']
]);

Cara lain, kalian juga bisa menggunakan opsi except untuk menghilangkan resource dari controller.

Route::resource('user', 'UserController', [
    'except' => ['destroy']
]);

API Resource

Ketika mengembangkan aplikasi Restful (API), tentunya kita tidak butuh method create() atau update() untuk menampilkan form. Alih-alih menggunakan partial resource (only & except), kita bisa menggunakan method apiResource() yang sudah disediakan Laravel.

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

Menamai Route

Layaknya route pada umumnya, resource controller juga dapat diberi nama sesuai dengan keinginan pemrogram. Secara default, route resource controller sudah memiliki nama. Opsi ini digunakan jika kalian ingin memberikan nama lain.

Route::resource('user', 'UserController', [
    'names' => [
        'create' => 'user.buat',
        'store' => 'user.simpan'
    ]
]);

Menambahkan Route Baru pada Resource Controller

Anggap saja, kita ingin menambahkan operasi baru pada resource controller, misalnya restore() dan forceDelete(). Hal ini memungkinkan untuk dilakukan. Kalian hanya perlu menambah route seperti (route) umumnya. Dan memastikan route baru tersebut berada pada definisi route resource controller.

Route::match(['put', 'patch'], 'user/{user}/restore', 'UserController@restore');
Route::delete('delete/{user}', 'UserController@delete');
Route::resource('user', 'UserController');

***

Dengan menggunakan resource controller, ada banyak waktu yang bisa kalian hemat, khususnya untuk aplikasi yang banyak operasi CRUD di dalamnya. Selain itu, ada banyak baris skrip yang bisa dihilangkan di bagian route dan controller.

Oh ya, walau gambar utama post ini berisi versi 5.5, tapi fitur resource controller ini sudah tersedia dari versi 5.1.

Nah, jika kalian merasa hanya mendapatkan informasi saja dari tulisan ini, mungkin kalian juga perlu cek tautan berikut untuk melihat contoh skrip lengkap. Tentunya, skrip tersebut perlu kalian modifikasi lagi agar dapat berfungsi pada aplikasi yang dikembangkan.

Jangan sungkan untuk bertanya melalui formulir komentar! 😉

2 comments

Tinggalkan Balasan