Tiga Cara Memvalidasi Form di Laravel


Validasi input — khususnya form — itu wajib hukumnya. Tentunya, agar data yang disimpan ke dalam pangkalan data sesuai dengan kebutuhan. Lainnya, untuk menghindari perusakan aplikasi dengan metode injection. Seperti XSS Injection misalnya.

Di luar sana, ada bayak package validasi yang bersifat agnostik, dapat diinstal ke dalam berbagai macam framework — bahkan plain PHP — . Pun begitu, Laravel sudah menyediakan fitur ini secara built-in, powerful dan tak perlu repot integrasi dengan framework.

Umumnya, ada tiga cara yang digunakan developer yang menggunakan Laravel sebagai basis frameworknya. Tidak ada cara yang salah, yang ada hanyalah standarisasi & konsistensi serta kenyamanan bagi developer itu sendiri.

Validasi Menggunakan Facade Validator

Tutorial penggunaan facade Validator umum kita temui di berbagai artikel yang membahas Laravel. Penggunaannya sederhana, kita cukup mengimpor facade tersebut, kemudian mendefinisikan rule yang akan dipakai.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Validator;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        // $this->middleware('auth');
    }

    /**
     * Validate form and submit
     *
     * @return void
     */
    public function send()
    {
        $validator = Validator::make(request()->all(), [
            'name'  => 'required|max:30',
            'email' => 'required|max:100|email',
        ]);
        
        if ($validator->fails()) {
            redirect()
                ->back()
                ->withErrors($validator->errors());
        }
    }
}

Argumen pertama pada method make() merupakan array berpasangan berupa key dan value. Kelebihan menggunakan cara ini adalah, kita bisa memvalidasi inputan dari HTTP verb GET .

Jangan lupa untuk memastikan datanya benar-benar valid dengan method fails().

Menggunakan Helper dari Controller

Pada controller, terdapat sebuah parent method dengan nama validate(). Method ini dapat digunakan untuk memvalidasi masukan dari form. Caranya serupa dengan di atas, yang membedakan adalah, jika argumen pertama pada method make() dalam facade Validator berupa array — key dan value — , maka pada method validate() harus berupa instanceof Request.

$request = new Request;
dd($request instanceof Request); // true
dd($request instanceof Validator); // false

Contoh implementasinya adalah seagai berikut.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        // $this->middleware('auth');
    }

    /**
     * Validate form and submit
     *
     * @return void
     */
    public function send(Request $request)
    {
        $this->validate($request, [
            'name'  => 'required|max:30',
            'email' => 'required|max:100|email',
        ]);
    }
}

Bagi yang terbiasa dengan Microframework Lumen, pasti sudah tidak asing dengan helper di atas. Karena, hanya cara inilah yang didukung oleh Lumen untuk memvalidasi masukan.

Apabila validasi gagal, maka aplikasi akan mengembalikan response daftar field yang tidak valid. Jadi, kita tidak perlu mengeceknya secara manual layaknya penggunaan facade Validator.

Menggunakan Form Request

Cara ini sedikit lebih panjang dan rumit di awal, tapi kita bakal punya kontrol lebih banyak untuk validasi.

Validation – Laravel – The PHP Framework For Web Artisans

Laravel – The PHP framework for web artisans.

Pertama, berkas validasi yang dibuat berada terpisah dengan controller. Ya, kita harus membuat berkas dan class baru di direktori lain. Tenang saja, command untuk membuat Form Request sudah tersedia pada Artisan Console.

$ php artisan make:request SendRequest

Apabila command berhasil, akan didapati sebuah berkas dengan nama SendRequest.php pada direktori app/Http/Requests. Buka berkas tersebut dan tambahkan aturan validasi dalam method rules(). Perlu diketahui, nilai kembaliannya harus berupa array dalam format seperti dua validasi di atas.

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class SendRequest 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 [
            'name'  => 'required|max:30',
            'email' => 'required|max:100|email',
        ];
    }
}

Pastikan nilai kembalian dari method authorize() adalah true untuk memastikan pengguna dapat melanjutkan ke proses validasi. Method authorize() ini nantinya dapat digunakan dalam berbagai keperluan, semisal hanya pengguna yang sudah login yang dapat mengisi formulir dan melanjutkan proses validasi.

/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize() : bool
{
    return \Auth::check();
}

Langkah berikutnya, mengimplementasikan Form Request tersebut pada controller dan method yang berfungsi menerima masukan.

<?php

namespace App\Http\Controllers;

use App\Http\Requests\SendRequest;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        // $this->middleware('auth');
    }

    /**
     * Validate form and submit
     *
     * @return void
     */
    public function send(SendRequest $request)
    {
        dd($request->all());
    }
}

Ada beberapa keuntungan menggunakan Form Request:

  • Controller menjadi lebih ramping dan lebih mudah dibaca.
  • Validasi masukan berada pada satu tempat, sehingga mudah untuk perawatan dan debugging.
  • Mendukung berbagai berbagai HTTP verb seperti POST, DELETE, PUT — dalam pengkondisian — . Khusus poin ini, menggunakan facade Validator pun juga dimungkinkan.

Sebagai contoh, dapat dilihat pada potongan skrip berikut:

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    $rules = [
        'name' => 'required|max:30',
    ];
    if (request()->isMethod('post')) {
        $rules['name'] = 'required|max:100|email';
    }
    if (request()->isMethod('delete')) {
        $rules['id'] = 'required|int';
    }
    return $rules;
}

Konklusi

Semua metode validasi di atas mendukung request menggunakan AJAX. Yang perlu diperhatikan adalah, jika validasi gagal, maka akan mengembalikan kode status 422 — Unprocessable Entity — . Selain itu, aplikasi juga akan mengembalikan response JSON berupa daftar kolom yang tidak valid.

Sebagai contoh request menggunakan Axios.

const url = '/user/create';
axios.post(url, this.forms).then(response => {
    // do something
}).catch(e => {
    if (e.response.status == 422) {
        this.errors = e.response.data;
    }
    else {
        this.alert = 'Internal Server Error';
    }
});

Untuk librari lain sepertu jQuery dan Vue-Resource, bisa disesuikan dengan kebutuhan masing-masing.

Bonus: Auto-Validate menggunakan Model

How To Auto-Validate Eloquent Models On Laravel 5.3

Whether it’s a best practice, I spotted a way to auto-validate Eloquent models. Thanks to the PHP built-in ReflectionClass.

 

Tak Berkategori

Yugo Purwanto

Pemrogram PHP dan JavaScript yang sedang sibuk mengembangkan aplikasi Glosarium Bahasa Indonesia.

2 comments

Tinggalkan Balasan