Hari ini saya masuk ke materi yang langsung terasa “nyambung” dengan kerjaan sehari-hari: form handling dan validasi. Dari semua bagian Laravel yang pernah saya coba, ini yang paling sering saya pakai — karena hampir semua aplikasi web pasti menerima input dari user, entah itu form login, form pendaftaran, atau form tambah data. Dan kalau input itu tidak dijaga, aplikasi bisa jebol. Jadi catatan kali ini saya buat agak lengkap, terutama soal CSRF dan Form Request yang sempat bikin saya menepuk jidat: “oh, selama ini saya repot-repot manual terus!”
Kenapa form di Laravel harus pakai @csrf?
Waktu pertama kali bikin form di Laravel, saya lupa menaruh @csrf dan dapat error 419 Page Expired. Saya sempat bingung, padahal form saya sudah benar. Ternyata ini justru fitur keamanan: Laravel melindungi aplikasi dari serangan CSRF (Cross-Site Request Forgery) — yaitu upaya pihak lain mengirim request atas nama user yang sedang login tanpa sepengetahuannya.
Cara kerjanya: Laravel membangkitkan token acak per sesi, disimpan di session, lalu form kita kirim token itu lewat field tersembunyi. Saat request masuk, Laravel mencocokkan token dari form dengan token di session. Tidak cocok → ditolak dengan 419. Jadi @csrf bukan pelengkap, melainkan wajib untuk semua form dengan method POST (PUT, PATCH, DELETE memakainya lewat method spoofing).
<form method="POST" action="/tasks">
@csrf
<input type="text" name="title">
<button type="submit">Simpan</button>
</form>
Validasi: jangan percaya input user
Prinsip yang terus saya tanamkan: input dari user itu data asing, jangan pernah dipercaya mentah-mentah. Laravel menyediakan lapisan validasi yang sangat enak dipakai. Cara paling sederhana — dan yang dulu selalu saya pakai — adalah memvalidasi langsung di controller:
<?php
// app/Http/Controllers/TaskController.php
public function store(Request $request)
{
$validated = $request->validate([
'title' => ['required', 'string', 'max:255'],
'due_date' => ['nullable', 'date', 'after_or_equal:today'],
]);
Task::create($validated);
return redirect()->route('tasks.index');
}
Kalau validasi gagal, Laravel otomatis mengarahkan kembali ke halaman sebelumnya sambil membawa error di session. Di Blade, error itu tinggal ditampilkan dengan directive @error, dan input lama bisa diisi ulang dengan helper old() supaya user tidak mengetik ulang dari nol:
<input type="text" name="title" value="{{ old('title') }}">
@error('title')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
Aturan tertulis sebagai array memberi keleluasaan: required, email, unique, min:8, confirmed, dan masih banyak lagi. Daftar lengkapnya ada di dokumentasi resmi — saya sering buka halaman validation-nya setiap minggu.
Form Request: validasi dipindah dari controller
Begitu controller mulai penuh aturan validasi, saya baru sadar ada cara yang lebih rapi: Form Request. Ini class khusus yang berisi aturan validasi, jadi controller tetap ramping dan aturan bisa dipakai ulang. Membuatnya semudah menjalankan artisan:
php artisan make:request StoreTaskRequest
<?php
// app/Http/Requests/StoreTaskRequest.php
class StoreTaskRequest extends FormRequest
{
public function authorize(): bool
{
return true; // false = 403, dipakai untuk cek otorisasi
}
public function rules(): array
{
return [
'title' => ['required', 'string', 'max:255'],
'due_date' => ['nullable', 'date', 'after_or_equal:today'],
];
}
}
Lalu di controller, tipe parameternya tinggal diganti dari Request menjadi StoreTaskRequest. Validasi jalan otomatis sebelum method dieksekusi — kalau gagal, user dikembalikan ke form beserta error-nya. Ini contoh nyata bagaimana Laravel mendorong kode yang rapi sebagai kebiasaan, bukan sebagai aturan yang dipaksakan.
Yang saya catat dari episode ini
@csrfwajib di semua form POST — error 419 adalah tanda aman, bukan bug.- Validasi inline di controller cukup untuk form sederhana, tapi cepat berantakan.
- Form Request = validasi terpusat + bisa dipakai ulang + authorize() gratis untuk urusan otorisasi.
old()dan@errormembuat pengalaman user tetap nyaman saat validasi gagal.
Di episode berikutnya saya mau masuk ke middleware — lapisan yang mengecek request sebelum sampai ke controller. Sepertinya di situlah letak “otak” dari proteksi auth dan CSRF tadi.
Komentar Terbaru