Tutorial Laravel #15: Form Validation di Laravel

1. Validasi di Laravel

Laravel menyediakan sistem validasi yang sangat powerful dan fleksibel. Ada tiga cara utama melakukan validasi: langsung di controller, menggunakan Form Request class, atau menggunakan Validator facade.

2. Validasi di Controller

public function store(Request $request)
{
    $request->validate([
        'judul'    => ['required', 'string', 'max:200'],
        'email'    => ['required', 'email', 'unique:users,email'],
        'password' => ['required', 'min:8', 'confirmed'],
        'umur'     => ['required', 'integer', 'min:17', 'max:99'],
        'gambar'   => ['nullable', 'image', 'mimes:jpg,png,webp', 'max:2048'],
    ]);
    // Lanjutkan jika valid...
}

3. Form Request Class - Cara yang Lebih Rapi

Form Request memisahkan logika validasi ke class tersendiri - sangat disarankan untuk project yang lebih besar:

php artisan make:request StoreArtikelRequest
php artisan make:request UpdateArtikelRequest
<?php
// app/Http/Requests/StoreArtikelRequest.php
namespace AppHttpRequests;

use IlluminateFoundationHttpFormRequest;

class StoreArtikelRequest extends FormRequest
{
    // Siapa yang boleh akses - return true untuk semua, atau cek auth
    public function authorize(): bool
    {
        return auth()->check();
    }

    // Aturan validasi
    public function rules(): array
    {
        return [
            'judul'       => 'required|string|max:200',
            'konten'      => 'required|string|min:100',
            'kategori_id' => 'required|exists:kategoris,id',
            'status'      => 'required|in:draft,published',
            'gambar'      => 'nullable|image|mimes:jpg,jpeg,png,webp|max:2048',
        ];
    }

    // Pesan error kustom
    public function messages(): array
    {
        return [
            'judul.required'       => 'Judul artikel tidak boleh kosong.',
            'judul.max'            => 'Judul maksimal 200 karakter.',
            'konten.min'           => 'Konten minimal 100 karakter.',
            'kategori_id.required' => 'Kategori wajib dipilih.',
            'kategori_id.exists'   => 'Kategori tidak valid.',
        ];
    }

    // Custom nama field untuk pesan error
    public function attributes(): array
    {
        return [
            'kategori_id' => 'kategori',
        ];
    }
}
// Gunakan di controller - Laravel otomatis validasi sebelum method dijalankan
public function store(StoreArtikelRequest $request)
{
    // Kalau sampai sini, validasi sudah pasti lolos
    // $request->validated() hanya berisi field yang ada di rules()
    Artikel::create($request->validated());

    return redirect()->route('artikel.index')->with('success', 'Berhasil!');
}

4. Aturan Validasi Lengkap

// Keberadaan dan tipe
'required', 'nullable', 'present'
'string', 'integer', 'numeric', 'boolean', 'array'

// Ukuran
'min:n', 'max:n', 'size:n', 'between:min,max'

// Format
'email', 'url', 'ip', 'uuid', 'date', 'date_format:Y-m-d'
'alpha', 'alpha_num', 'alpha_dash'
'regex:/pattern/'

// Database
'unique:tabel,kolom'
'unique:tabel,kolom,id_kecuali'  // untuk update
'exists:tabel,kolom'

// File
'file', 'image', 'mimes:jpg,png', 'mimetypes:image/jpeg'
'max:2048'  // max 2MB dalam kilobytes

// Konfirmasi password
'confirmed'  // perlu field nama_field_confirmation

5. Validasi Unik saat Update

// Saat update, kita perlu ignore ID record yang sedang diedit
use IlluminateValidationRule;

public function rules(): array
{
    return [
        'email' => [
            'required',
            'email',
            Rule::unique('users', 'email')->ignore($this->route('user')),
        ],
    ];
}

6. Menampilkan Error di Blade

<!-- Tampilkan semua error sekaligus -->
@if($errors->any())
    <div class="alert alert-danger">
        <ul class="mb-0">
            @foreach($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

<!-- Error per field -->
<input name="judul" value="{{ old('judul') }}"
       class="form-control @error('judul') is-invalid @enderror">
@error('judul')
    <div class="invalid-feedback">{{ $message }}</div>
@enderror

7. Ringkasan

  • Validasi cepat bisa langsung di controller dengan $request->validate()
  • Form Request class lebih rapi untuk validasi yang kompleks
  • Gunakan Rule::unique()->ignore() untuk validasi unik saat update
  • $request->validated() hanya mengembalikan field yang ada di rules

Tutorial berikutnya membahas session dan flash message di Laravel.


ariq fadhil

Im Ariq Tech, a Top Rated Fullstack Developer with 5+ years of experience, delivering high-quality solutions across 50+ projects.