Pentingnya Memisahkan Request dari Controller di Laravel

Class Request Handler di Laravel
Class Request di Laravel
Laravel adalah framework PHP untuk web artisan. Laravel sangat membantu kita untuk membangun aplikasi dan API yang kuat. Seperti yang sudah kalian tau ada banyak cara untuk memvalidasi request di Laravel. Menangani validasi request adalah sesuatu yang sangat penting pada sebuah sistem, untuk itu kita perlu berhati-hati. Laravel memiliki beberapa fitur keren yang berhubungan dengan ini dengan performa yang sangat bagus tentunya jika diterapkan.

Awalan

Sebagian besar dari kita biasanya memakai validator yang ditempatkan di controller. Enggak ada yang salah, dan itu menjadi cara paling umum yang sampai saat ini masih digunakan oleh banyak orang termasuk mimin sendiri sebelum mengetahui fakta tentang pentingnya memisahkan request dengan controller.

Misalnya, begini contoh kodingan di UserController yang kita pakai:

<?php

namespace App\Http\Controllers\API\v1\Users;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Entities\Models\User;

class UserController extends Controller
{
    public function saveUser(Request $request)
    {
        
        // Validasi dari request form
        
        $validate = Validator::make($request->all(), [
           'email' => 'required|email|unique:users',
           'name' => 'required|string|max:50',
           'password' => 'required'
       ]);
        
       if ($validate->fails()) {
            Session::flash('error', $validate->messages()->first());
            return redirect()->back()->withInput();
       }
        
    }
}

Sekali lagi, tidak ada yang salah dengan cara memvalidasi request masuk di controller tetapi menurut mimin itu bukan cara terbaik untuk validasi dan pastinya controller kita bakalan terlihat kurang rapi. Controller harusnya melakukan hanya satu hal menangani permintaan dari route dan mengembalikan response yang tepat.

Menempatkan validator pada controller akan merusak prinsip The Single Responsibility. Kita semua tau bahwa requirements bisa berubah seiring waktu dan setiap kali requirements berubah, fungsi class  juga berubah. Jadi memiliki banyak fungsi di class tunggal membuatnya sulit untuk dikelola. Laravel memiliki Form Request, class Request terpisah yang berfungsi sebagai validator. Untuk membuatnya, kita dapat menggunakan perintah Artisan di bawah ini.

php artisan make:request UserStoreRequest

yang mana command diatas akan membuat class Request baru di app\Http\Request\UserRequest
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserStoreRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'email' => 'required|email|unique:users',
            'name' => 'required|string|max:50',
            'password' => 'required'
        ];
    }

     /**
     * Custom message for validation
     *
     * @return array
     */
    public function messages()
    {
        return [
            'email.required' => 'Email is required!',
            'name.required' => 'Name is required!',
            'password.required' => 'Password is required!'
        ];
    }
}

Laravel Form Request Class membawa dua metode default auth() dan rules(). Kita dapat melakukan logika otorisasi apa pun dalam method auth() apakah pengguna saat ini diizinkan untuk melakukan request atau tidak. Sedangkan dalam method rules() kita dapat menulis semua aturan validasi yang kita ingin buat. Ada satu method tambahan message(), yaitu tempat kita meletakkan pesan validasi kita sendiri.

Sekarang ubah UserController untuk menggunakan UserStoreRequest. Kita dapat type-hint request class dan itu akan secara otomatis menyelesaikan dan memvalidasi sebelum fungsi controller dipanggil.

Begini contohnya :
<?php

namespace App\Http\Controllers\API\v1\Users;

use App\Http\Controllers\Controller;
use App\Http\Requests\UserStoreRequest;

class UserController extends Controller
{
    public function store(UserStoreRequest $request)
    {
        // Will return only validated data
        
        $validated = $request->validated();
    }
}

Dengan begitu, controller kita sekarang lebih rapih dan mudah untuk dikelola.

Jika validasi gagal, maka akan mengarahkan pengguna ke lokasi sebelumnya dengan pesan kesalahan. Tergantung pada pesan kesalahan yang mana, kita dapat menyesuaikan pesan flash dalam sesi tersebut. Jika permintaan berupa AJAX maka respons dengan kode status 422, maka akan dikembalikan dengan kesalahan dalam format JSON.

Posting Komentar untuk "Pentingnya Memisahkan Request dari Controller di Laravel"

Berlangganan via Email

Adblock Terdeteksi

Mohon matikan plugin Adblock untuk tetap mendukung situs ini berkembang

Disable Adblock & Reload