PHP Validation Form Requests Redirects Error Bags
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama PHP untuk melanjutkan topik lainnya.
Kembali ke rujukan utama PHP untuk melanjutkan topik lainnya.
Di Laravel, form backend biasanya mengikuti alur yang cukup konsisten: request masuk, data divalidasi, lalu aplikasi mengembalikan response. Kalau validasi gagal, response paling sering berupa redirect kembali ke form dengan error message dan input lama. Kalau validasi lolos, request lanjut ke proses simpan atau update data.
Empat konsep yang paling sering dipakai di sini adalah:
Kalau dibaca dari sisi produksi, topik ini bukan cuma soal syntax. Yang penting adalah memahami kapan controller masih cukup, kapan validasi harus dipindah, dan bagaimana error bisa kembali ke view tanpa bikin alur form berantakan.
Diagram ini menunjukkan pola yang paling umum di form web Laravel. Validation gagal bukan berarti aplikasi berhenti tanpa arah; biasanya request dialihkan kembali sambil membawa error dan input lama lewat session.
Untuk form yang kecil dan aturan validasinya masih sederhana, validation di controller sering sudah cukup. Contohnya ketika:
validate() di dalamnyaContoh:
public function store(Request $request)
{
$validated = $request->validate([
'title' => ['required', 'string', 'max:255'],
'body' => ['required', 'string'],
]);
Post::create($validated);
return redirect()->route
Cara ini cocok untuk endpoint sederhana karena cepat, eksplisit, dan tidak menambah file baru tanpa alasan.
Kalau controller mulai penuh dengan rules, conditional validation, atau pengecekan authorization yang makin spesifik, biasanya validasi sebaiknya dipindah.
FormRequest lebih cocok kalau validasi mulai menjadi bagian yang serius dari alur aplikasi, bukan sekadar check kecil di controller.
Pindahkan ke FormRequest kalau:
prepareForValidation() atau withValidator()Contoh:
use Illuminate\Foundation\Http\FormRequest;
class StorePostRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
Controller-nya jadi lebih ringan:
public function store(StorePostRequest $request)
{
$validated = $request->validated();
Post::create($validated);
return redirect()->route('posts.index');
}FormRequest bagus, tapi jangan dipakai hanya karena ingin “rapi”. Untuk form yang benar-benar kecil, validation di controller tetap valid. Yang penting adalah keterbacaan dan biaya perawatan, bukan jumlah file.
Di form web Laravel, validation failure biasanya tidak mengembalikan JSON. Yang terjadi adalah browser diarahkan kembali ke halaman sebelumnya atau halaman form, lalu session membawa error dan old input.
Pola umumnya seperti ini:
Itu sebabnya nilai field sering tetap terisi setelah gagal submit.
return redirect()
->back()
->withErrors(['title' => 'Judul wajib diisi'])
->withInput();return redirect()
->route('posts.index')
->with('status', 'Post berhasil disimpan');redirect()->back() mengirim user kembali ke halaman sebelumnyawithErrors() menaruh error ke session untuk dibaca viewwithInput() menaruh input lama ke sessionError bag adalah cara Laravel memisahkan kumpulan error validasi. Secara default, Laravel memakai error bag bernama default. Itu cukup untuk satu form sederhana dalam satu halaman.
Masalah muncul ketika satu halaman punya beberapa form. Misalnya:
Kalau semua error dilempar ke bag yang sama, view bisa bingung menampilkan pesan yang mana untuk form yang mana.
return redirect()
->back()
->withErrors($validator, 'profileUpdate')
->withInput();Di view, error-nya dibaca dari bag yang sama:
@error('name', 'profileUpdate')
<div>{{ $message }}</div>
@enderrorAtau:
@if ($errors->profileUpdate->has('name'))
<div>{{ $errors->profileUpdate->first('name') }}</div>
@endifKalau halaman hanya punya satu form utama, default bag biasanya paling sederhana. Named bag baru terasa manfaatnya saat halaman mulai padat.
FormRequest sebenarnya memudahkan redirect/error bag juga. Saat validation gagal, Laravel akan otomatis mengembalikan response yang sesuai untuk konteks request.
Untuk form web biasa:
Untuk request API:
Artinya, perilaku validasi tidak sama di semua konteks. Web form cenderung redirect, sedangkan API cenderung response JSON.
Frontend validation membantu UX, tetapi bukan batas keamanan. Server tetap harus memvalidasi ulang.
Kalau controller penuh dengan rules, message, dan kondisi bercabang, sulit dibaca dan sulit dites. Itu tanda FormRequest mulai lebih cocok.
Kalau redirect gagal tidak menyertakan input lama, user harus mengetik ulang semuanya. Di form yang panjang, ini bikin pengalaman buruk.
Kalau ada beberapa form di satu halaman, error bisa muncul di blok yang salah kalau tidak dipisahkan dengan named bag.
Jangan pernah simpan ke database dulu lalu validasi belakangan. Urutan yang benar adalah validasi dulu, baru proses bisnis.
Validasi menjawab “datanya valid atau tidak”. Authorization menjawab “user ini boleh melakukan aksi ini atau tidak”. Dua hal ini beda.
Saat update, beberapa field mungkin boleh kosong atau tidak boleh sama dengan record saat ini. FormRequest terpisah sering lebih bersih daripada satu ruleset yang dipaksa menampung semua skenario.
Pesan seperti “Terjadi kesalahan” memang aman, tapi sering terlalu kabur untuk debugging. Sebaliknya, pesan juga jangan terlalu bocor ke detail internal.
public function store(StorePostRequest $request)
{
$validated = $request->validated();
Post::create([
'title' => $validated['title'],
'body' => $validated['body'],
Kalau validasi gagal, Laravel akan otomatis kembali ke form dan menaruh error ke session. Kalau berhasil, aplikasi lanjut ke proses simpan lalu redirect sukses.
withInput() ikut dikirim.