Validasi adalah garis pertahanan pertama aplikasi Anda: ia memastikan data yang masuk sesuai harapan sebelum menyentuh database. Laravel menyediakan sistem validasi yang sangat lengkap, tapi banyak developer menumpuk semuanya di controller sampai berantakan. Artikel ini menunjukkan cara memvalidasi form dengan rapi di Laravel 10/11 — dari yang paling sederhana hingga rule kustom.
1. Validasi Inline dengan validate()
Cara tercepat: panggil $request->validate() langsung di controller. Jika gagal, Laravel otomatis mengembalikan pengguna ke halaman sebelumnya beserta pesan error dan input lama.
public function store(Request $request)
{
$data = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email',
'age' => 'nullable|integer|min:17',
]);
User::create($data);
return back()->with('success', 'Data tersimpan.');
}
Nilai kembalian validate() hanya berisi field yang lolos aturan — aman untuk langsung dipakai create().
2. Aturan Validasi yang Sering Dipakai
required/nullable— wajib atau boleh kosong.email,numeric,integer,string,boolean— tipe data.min:3/max:255— panjang string atau nilai angka.unique:users,email/exists:categories,id— cek ke database.confirmed— cocok untuk password (butuh fieldpassword_confirmation).in:draft,published— nilai harus salah satu dari daftar.
3. Form Request untuk Controller yang Bersih
Saat aturan bertambah banyak, pindahkan ke kelas Form Request agar controller tetap ramping:
php artisan make:request StoreArticleRequest
Isi method authorize() dan rules():
public function authorize(): bool
{
return true; // ganti dengan logika izin bila perlu
}
public function rules(): array
{
return [
'title' => 'required|string|max:150',
'body' => 'required|string',
'status' => 'required|in:draft,published',
'tags' => 'array',
'tags.*' => 'string|max:30',
];
}
Lalu cukup type-hint di controller — validasi berjalan otomatis sebelum method dijalankan:
public function store(StoreArticleRequest $request)
{
Article::create($request->validated());
return redirect()->route('articles.index');
}
4. Pesan dan Nama Atribut Kustom
Pesan error bawaan berbahasa Inggris. Timpa dengan method messages() dan attributes() di Form Request:
public function messages(): array
{
return [
'title.required' => 'Judul wajib diisi.',
'title.max' => 'Judul maksimal 150 karakter.',
];
}
public function attributes(): array
{
return [
'title' => 'judul artikel',
];
}
Dengan attributes(), pesan generik seperti "The title field is required" berubah menjadi "The judul artikel field is required" — berguna untuk placeholder :attribute.
5. Aturan Validasi Kustom
Untuk logika unik, buat rule sendiri:
php artisan make:rule Uppercase
public function validate(string $attribute, mixed $value, Closure $fail): void
{
if (strtoupper($value) !== $value) {
$fail('The :attribute harus huruf kapital.');
}
}
Pakai di aturan seperti rule bawaan:
'code' => ['required', new Uppercase],
Untuk validasi sekali pakai, closure juga bisa langsung ditulis inline:
'slug' => [
'required',
function ($attribute, $value, $fail) {
if (str_contains($value, ' ')) {
$fail('Slug tidak boleh mengandung spasi.');
}
},
],
6. Menampilkan Error di Blade
Laravel menyimpan error di variabel $errors yang selalu tersedia di setiap view. Tampilkan per field dan pertahankan input lama dengan old():
<input type="text" name="title" value="{{ old('title') }}">
@error('title')
<span class="text-red-500">{{ $message }}</span>
@enderror
Untuk menampilkan semua error sekaligus di atas form:
@if ($errors->any())
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
7. Validasi Array dan File
Gunakan notasi titik * untuk memvalidasi tiap elemen array, dan aturan file untuk unggahan:
$request->validate([
'items' => 'required|array|min:1',
'items.*.name' => 'required|string',
'items.*.qty' => 'required|integer|min:1',
'avatar' => 'required|image|mimes:jpg,png|max:2048',
]);
Aturan max:2048 pada file dihitung dalam kilobyte, jadi contoh di atas membatasi ukuran gambar hingga 2 MB.
Kesimpulan
Mulailah dengan validate() inline untuk form sederhana, lalu pindah ke Form Request begitu aturan bertambah. Timpa pesan agar ramah pengguna, dan buat rule kustom untuk kebutuhan khusus. Dengan pola ini validasi Anda tetap terpusat, mudah diuji, dan controller tetap bersih.
Menyusun Pesan Error yang Ramah
Validasi yang baik tidak berhenti pada aturan, tetapi juga pada cara menyampaikan kesalahan kepada pengguna. Pesan error sebaiknya jelas, spesifik, dan memandu, bukan sekadar menyatakan bahwa ada yang salah. Alih-alih menulis input tidak valid, jelaskan apa yang diharapkan, misalnya format email harus benar atau kata sandi minimal delapan karakter. Manfaatkan berkas terjemahan agar pesan konsisten dan mudah dilokalkan ke bahasa Indonesia. Tampilkan error tepat di sebelah kolom yang bermasalah agar pengguna langsung tahu bagian mana yang perlu diperbaiki. Pertahankan input yang sudah diisi ketika validasi gagal agar pengguna tidak perlu mengetik ulang. Dengan pesan yang ramah dan penempatan yang tepat, proses pengisian formulir menjadi lebih nyaman dan tingkat penyelesaiannya meningkat.