Kenapa Validation Error Tidak Muncul di Laravel Blade?
Kadang validasi Laravel sebenarnya sudah gagal, tetapi pesan error tidak tampil di Blade. Dari sisi user, hasilnya membingungkan: form seolah reload biasa, input lama hilang, atau tidak ada petunjuk field mana yang bermasalah.
Masalah ini biasanya bukan di validator Laravel, melainkan di cara form dan view menangani hasil validasi. Jadi fokus debugging-nya harus ke nama field, route middleware, session, dan cara Blade menampilkan $errors.
Kapan Masalah Ini Biasanya Muncul?
- Form submit kembali ke halaman semula, tetapi tidak ada pesan apa pun
- Input lama tidak muncul kembali setelah validasi gagal
- Hanya sebagian field yang menampilkan error
- Form Request dipakai, tetapi halaman terlihat "diam"
- Request AJAX mengembalikan 422, tetapi UI tidak menampilkan pesan
Penyebab Paling Umum
1. Blade Tidak Menampilkan $errors
Laravel memang menyimpan error ke session, tetapi Blade tetap harus menampilkannya.
Tanpa blok @error('nama') atau daftar $errors->all(), user tidak akan melihat apa pun.
2. Nama Input Tidak Sama dengan Nama Rule
Kalau rule memakai title, tetapi input HTML bernama judul, error akan tersimpan untuk key title, bukan judul.
3. Route Tidak Lewat Middleware web
Untuk request web biasa, Laravel menyimpan error validasi dan old input lewat session. Kalau route tidak memakai stack web, mekanisme ini tidak tersedia.
4. authorize() di Form Request Mengembalikan false
Kalau method authorize() tidak diizinkan, request akan berhenti sebelum error validasi sampai ke Blade.
5. Request AJAX Belum Menangani Respons 422
Pada request JavaScript, Laravel biasanya mengembalikan JSON berisi error. Kalau frontend tidak membaca respons ini, user tetap tidak melihat apa-apa.
Langkah Diagnosis
- Pastikan validasi memang gagal dengan mencoba input kosong atau sengaja salah.
- Cek tab Network:
- web form biasa biasanya redirect
302 - AJAX biasanya mendapat
422 Unprocessable Entity
- web form biasa biasanya redirect
- Pastikan field di Blade dan aturan validasi memakai nama yang sama.
- Pastikan view menampilkan
@error(...)atau$errors->all(). - Kalau memakai Form Request, cek method
authorize().
Penyebab paling sering adalah mismatch sederhana: input bernama judul, tetapi error yang dicari di Blade adalah title.
Langkah Fix
1. Tampilkan Error Per Field
2. Tampilkan Ringkasan Semua Error
3. Samakan Nama Input dan Rule
4. Pastikan Form Request Mengizinkan Request
5. Tangani Error 422 di AJAX
Contoh Sebelum dan Sesudah
Sebelum
User tidak tahu kenapa form gagal karena error tidak pernah dirender.
Sesudah
Error Umum
Error Ada di Session, Tetapi Tidak Terlihat
Biasanya karena Blade tidak punya blok @error atau daftar $errors.
Input Lama Tidak Muncul
Periksa apakah field memakai value="{{ old('nama') }}" atau old() untuk textarea/select.
Form Request Dipakai, Tapi Langsung 403
Kemungkinan authorize() mengembalikan false, jadi masalahnya bukan di validasi.
Pencegahan
- Setiap field penting sebaiknya punya blok
@error. - Gunakan nama field yang konsisten dari HTML sampai validator.
- Untuk form besar, tampilkan juga ringkasan
$errors->all(). - Pisahkan penanganan error untuk form biasa dan request AJAX.
- Jangan lupa
old()agar pengalaman user tetap baik saat validasi gagal.
Bacaan Terkait
- Validasi & Form Request
- Cara Mengatasi 419 Page Expired di Laravel
- CSRF Token Mismatch di Laravel: Penyebab dan Solusi
- View Not Found di Laravel: Penyebab dan Solusi
- Otentikasi Laravel
- Middleware Laravel
- Panduan Error Laravel
FAQ
Kenapa error validasi muncul di JSON, tetapi tidak di Blade?
Karena request kemungkinan dikirim sebagai AJAX atau frontend tidak merender pesan error yang dikembalikan Laravel.
Apakah wajib memakai @error di setiap field?
Tidak wajib, tetapi itu cara paling jelas agar user tahu field mana yang salah. Minimal sediakan satu ringkasan error global.
Kenapa validasi gagal, tetapi malah muncul error 419?
Itu masalah berbeda. Validasi belum sempat dijalankan karena request lebih dulu gagal di proteksi CSRF atau session.