Tanggal :15 Oktober 2024
Laravel Single Action Controller

Menggunakan Single Action Controller Pada Laravel

Assalamualaikum Warohmatulloh Wabarokatuh, mungkin hampir semua dari kita yang menulis program dengan Laravel akan membuat Restful Controller untuk membuat proses. Hal ini wajar karena dalam dokumentasi Laravel memang dicontohkan seperti itu dan kebanyakan artikel atau tutorial juga menggunakan cara tersebut. Tapi, tahukah kalau kita bisa menggunakan cara lain yang mungkin lebih “cantik” dengan menggunakan Single Action Controller.

Apa itu Single Action Controller ?

Sesuai namanya Single Action Controller adalah sebuah controller yang hanya memiliki satu aksi atau method. Dalam Single Action Controller ini kita akan menggunakan magic method __invoke().

Laravel juga menyediakan cara mudah untuk membuat Single Action Controller menggunakan perintah artisan dengan menambahkan flag -i.

php artisan make:controller NamaController -i

Kurang lebih akan menghasilkan file controller seperti ini :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class NamaController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {
        //
    }
}

Kemudian kita bisa menuliskan semua kode kita ke dalam method __invoke(). Untuk mendaftarkan route dari Single Action Controller ini kita tidak perlu mendefinisikan nama methodnya.

Route::get('/url', NamaController::class);

Keuntungan Menggunakan Single Action Controller

Sampai sini mungkin kawan-kawan bertanya, panjang lebar bahas Single Action Controller, lalu apa sih keuntungannya? Baiklah semoga saya bisa sedikit memberikan jawaban dalam tulisan ini.

Kok bingung ya jelasinnya haha. Oke kita buat contoh aja deh biar lebih mudah jelasinnya ya. Jadi, misalnya nih kita punya sebuah data / tabel schedules dan model Schedule dari schedule atau jadwal ini kita ingin menampilkan data jadwal yang akan datang, jadwal yang sudah berlalu dan semua data jadwal. Jika kita gunakan resource controller maka hal ini biasanya akan kita selesaikan pad method index().

    public function index(Request $request)
    {
        if ($request->boolean('past')) {
            $schedules = Schedule::past()->paginate(10);
        } else if ($request->boolean('upcoming')) {
            $schedules = Schedule::upcoming()->paginate(10);
        } else {
            $schedules = Schedule::paginate(10);
        }

        return view('schedule.index', compact('schedules'));
    }

Kemudian kita akan daftarkan route untuk method index().

Route::get('schedule', [ScheduleController::class, 'index']);

Tidak ada yang salah dengan cara tersebut, tapi ini sedikit gambaran ketika kita gunakan Single Action Controller. Kita bisa memisahkan setiap logika yang ada ke dalam controller yang berbeda dan akan kita daftarkan routenya sebagai berikut.

Route::get('schedule', ShowAllScheduleController::class);
Route::get('schedule/past', ShowPastScheduleController::class);
Route::get('schedule/upcoming', ShowUpcomingScheduleController::class);

Terlihat lebih ribet daripada menggunakan satu method yang sebelumnya ya? tapi jika diperhatikan lebih jauh lagi, dengan cara seperti ini terlihat lebih ekspresif. Kita juga bisa langsung menentukan controller mana yang memegang logika dari skenario tertentu, jika kita bandingkan untu URInya terlihat ada sedikit peningkatan dalam keterbacaan.

# Sebelumnya
/schedule
/schedule?past=true
/schedule?upcoming=true

# Sesudah
/schedule
/schedule/past
/schedule/upcoming

Jika kita perhatikan lebih jauh lagi ke dalam controller yang kita miliki saat ini misalnya pada ShowPastScheduleController :

<?php

namespace App\Http\Controllers;

use App\Models\Schedule;

final class ShowUpcomingScheduleController
{
    public function __invoke()
    {
        $events = Schedule::upcoming()->paginate(10);
    
        return view('schedule.index', compact('schedules'));
    }
}

Kita tidak lagi memerlukan statemen if dan membuat kode lebih mudah dibaca, kita tidak lagi menggunakan CRUD controller (resources) dan membuat controller yang berdiri sendiri sesuai dengan skenarionya.

Sekian sedikit pembahasan tentang menggunakan Single Action Controller pada framework Laravel.

Wassalamualaikum Warohmatulloh Wabarokatuh

Hai semua, saya Amirul seorang Software Engineer, suka membuat konten pembelajaran berupa artikel, video tutorial maupun podcast

2 Comments

Tinggalkan Balasan