Setelah membahas tentang Mudahnya membuat routing dengan Laravel, kali ini saya akan membahas soal Single Action Controller di Laravel, dimana saya yakin ini akan membuat kalian semua ingin melakukan rewrite pada aplikasi yang sudah kalian buat atau kalian kerjakan saat ini. Baiklah, selamat membaca!

Apa itu Single Action Controller

Sederhananya Single Action Controller ini adalah sebuah pattern yang hanya menggunakan satu controller untuk meng-handle logic saat mengakses sebuah route. Kalau dari pernyataan barusan bisa kita simpulkan seperti ini: "setiap route di-handle oleh controller yang berbeda-beda".

Oke, saya akan berikan contoh sederhana. web.php

Route::post('/products', 'ProductsController@store');

ProductsController.php

class ProductsController extends Controller {
    public function store(Request $request) {
        // storing product to DB
    }
}
// there are another methods up here

Di atas ini adalah contoh route yang tidak mengimplementasi Single Action Controller, route untuk /products ini di-handle oleh method bernama store() yang terdaftar di ProductsController, dan sedangkan di ProductsController ini ada method-method lain yang meng-handle route lainnya juga. Sehingga tidak jarang kalau di Controller tersebut sudah mencapai 500 baris atau lebih maka akan mempersulit developer ketika melakukan tweak atau maintenance. Tapi akan lain cerita saat kita mengimplementasi Single Action Controller, contoh sederhananya seperti ini: web.php

Route::post('/products', 'CreateProductController');

CreateProductController.php

class CreateProductController extends Controller {
    public function __invoke(Request $request) {
        // storing product to DB
    }
}

Dari contoh barusan bisa kita lihat kalau controller bernama CreateProductController hanya bertugas untuk meng-handle route /products. Terlihat lebih rapi dan terstruktur bukan?

How to make it?

Tentu saja untuk mengimplementasi Single Action Controller ini sangatlah sederhana, yang jadi poinnya adalah kita harus tahu maksud dari route atau endpoint yang akan kita buat. Oke, saya akan buat satu contoh sederhana lagi. Misalkan saya mau membuat route /auth/register yang memiliki maksud untuk membuat user baru, sehingga dari maksud route itu saya akan membuat controller dengan nama CreateUserController, dan akan saya gunakan seperti ini:

// file web.php
Route::post('auth/register', 'CreateUserController');
//file CreateUserController.php
class CreateUserController extends Controller {
    // use __invoke method
    public function __invoke(Request $request) 
    {
        $valid = $this->validateUserRequest($request->all());
        if (!$valid) {
            // do something when not valid
        }
        // if valid continue create user
        $user = User::create($request->all());

        return response()->json([
            'success' => true,
            'message' => 'user has been created',
            'data' => $user,
        ]);
    }

    // create validator
    public function validateUserRequest($data) 
    {
        // craete the rules
        $rules = [
            'name' => 'required',
            'email' => 'required',
            'password' => 'required'
        ];
        // validate the data based on rules
        $validator = Validator::make($data, $rules);

        // if validator fails return that it is not valid
        if($validator->fails()) {
            return false;
        }

        return true;
    }
}

Kira-kira seperti itu code yang akan saya buat, terstruktur, sehingga suatu saat jika saya perlu melakukan tweak pada route /auth/register saya hanya perlu mengecek file CreateUserController.php, dan developing pun menjadi lebih mudah.

Kesimpulan

Baiklah, mungkin sampai sini saja yang bisa saya bahas soal Single Action Controller, semoga pembahasan kali ini bisa bermanfaat bagi kita semua. Selamat bereksplorasi dengan Single Action Controller dan sampai bertemu di artikel selanjutnya.

おつかれさまでした~