Cara Validasi Form di Laravel Lengkap (validate, Form Request, Custom Message)

Data yang masuk dari pengguna tidak boleh dipercaya begitu saja — bisa kosong, salah format, atau berbahaya. Validasi adalah lapisan pertahanan pertama yang memastikan data bersih sebelum diproses atau disimpan. Laravel menyediakan sistem validasi yang sangat elegan. Artikel ini membahas cara validasi form di Laravel secara lengkap, dari yang paling sederhana hingga profesional.

Diagram alur validasi form Laravel
Diagram alur validasi form Laravel

Mengapa Validasi Wajib?

Bayangkan form pendaftaran tanpa validasi: pengguna bisa mendaftar dengan email kosong, password 1 karakter, atau umur berupa teks. Validasi mencegah semua itu dan memberi pesan yang jelas kepada pengguna tentang apa yang perlu diperbaiki. Di Laravel, validasi juga otomatis menangani penyimpanan input lama dan penampilan pesan error.

Cara 1: Validasi Langsung di Controller

Cara tercepat memakai method validate() pada request. Jika validasi gagal, Laravel otomatis mengembalikan pengguna ke halaman form dengan pesan error — Anda tidak perlu menulis logika redirect sendiri.

<?php
public function store(Request $request)
{
    $validated = $request->validate([
        'nama'     => 'required|min:3|max:50',
        'email'    => 'required|email|unique:users,email',
        'umur'     => 'required|integer|min:17',
        'password' => 'required|min:6|confirmed',
    ]);

    // kode di bawah HANYA berjalan jika semua validasi lolos
    User::create($validated);
    return redirect('/users')->with('sukses', 'Data tersimpan!');
}
?>

Method validate() mengembalikan hanya data yang lolos validasi, sehingga aman langsung dipakai untuk create().

Aturan Validasi yang Sering Dipakai

AturanArti
requiredWajib diisi
emailHarus format email valid
min:3 / max:50Panjang minimal/maksimal (atau nilai untuk angka)
integer / numericHarus angka
unique:users,emailBelum ada di kolom email tabel users
confirmedHarus cocok dengan field password_confirmation
in:admin,userNilainya harus salah satu dari daftar
image / mimes:jpg,pngUntuk validasi file upload
date / after:todayValidasi tanggal

Menampilkan Pesan Error di Blade

Laravel otomatis mengirim error ke view lewat variabel $errors. Tampilkan di form:

<form method="post" action="/users">
    @csrf

    <input type="text" name="nama" value="{{ old('nama') }}">
    @error('nama')
        <span style="color:red">{{ $message }}</span>
    @enderror

    <input type="email" name="email" value="{{ old('email') }}">
    @error('email')
        <span style="color:red">{{ $message }}</span>
    @enderror

    <button type="submit">Simpan</button>
</form>

Dua hal penting di sini:

  • @error('nama') ... @enderror menampilkan pesan error khusus field itu.
  • old('nama') mengembalikan nilai yang tadi diketik pengguna, sehingga form tidak kosong lagi setelah gagal validasi — pengalaman pengguna jauh lebih baik.

Untuk menampilkan semua error sekaligus di atas form:

@if ($errors->any())
    <div class="alert">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

Cara 2: Form Request (untuk Validasi Kompleks)

Bila aturan validasi banyak, menaruhnya di controller membuat kode “gemuk”. Solusi profesional adalah Form Request — kelas khusus untuk validasi. Buat dengan artisan:

php artisan make:request StoreUserRequest

Buka app/Http/Requests/StoreUserRequest.php:

<?php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true; // true = siapa saja boleh, atau cek izin di sini
    }

    public function rules(): array
    {
        return [
            'nama'  => 'required|min:3',
            'email' => 'required|email|unique:users,email',
            'umur'  => 'required|integer|min:17',
        ];
    }
}
?>

Lalu di controller, cukup ganti Request dengan Form Request tadi — validasi berjalan otomatis:

<?php
use App\Http\Requests\StoreUserRequest;

public function store(StoreUserRequest $request)
{
    // data sudah pasti valid di sini
    User::create($request->validated());
    return redirect('/users');
}
?>

Controller jadi bersih, dan aturan validasi bisa dipakai ulang.

Pesan Error Kustom (Bahasa Indonesia)

Pesan bawaan Laravel berbahasa Inggris. Untuk menggantinya, tambahkan method messages() di Form Request (atau argumen kedua pada validate()):

<?php
public function messages(): array
{
    return [
        'nama.required'  => 'Nama wajib diisi.',
        'nama.min'       => 'Nama minimal 3 karakter.',
        'email.required' => 'Email wajib diisi.',
        'email.email'    => 'Format email tidak valid.',
        'email.unique'   => 'Email ini sudah terdaftar.',
    ];
}
?>

Validasi File Upload

<?php
$request->validate([
    'foto' => 'required|image|mimes:jpg,jpeg,png|max:2048', // max 2MB
]);
?>

Kesalahan Umum

  • Lupa @csrf di form — menyebabkan error 419 (Page Expired), bukan error validasi.
  • Form kosong setelah gagal validasi — lupa memakai old('nama') pada value input.
  • Validasi tidak jalan — pada Form Request, pastikan method authorize() mengembalikan true.
  • Aturan confirmed gagal terus — nama field konfirmasi harus persis password_confirmation.

Kesimpulan

Anda telah menguasai validasi form di Laravel secara menyeluruh: validasi cepat dengan validate(), menampilkan error dan input lama di Blade, Form Request untuk validasi kompleks yang rapi, hingga pesan error kustom berbahasa Indonesia. Validasi yang baik melindungi aplikasi Anda sekaligus memberi pengalaman pengguna yang ramah. Kombinasikan dengan relasi Eloquent untuk memastikan hanya data valid yang masuk ke database Anda.

Referensi: untuk pendalaman, kunjungi dokumentasi resmi Laravel.

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *