Laravel Middleware Request Response Validation Flow
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama Laravel untuk melanjutkan topik lainnya.
Kembali ke rujukan utama Laravel untuk melanjutkan topik lainnya.
Middleware di Laravel adalah lapisan yang berada di antara request masuk dan aksi aplikasi. Lapisan ini bisa memeriksa, memodifikasi, atau menghentikan request sebelum sampai ke controller, dan juga bisa ikut menangani response saat keluar.
Request adalah paket data yang dibawa oleh browser, client API, atau aplikasi lain ke Laravel. Di dalamnya ada method, URL, headers, cookies, body, file upload, dan konteks lain yang dipakai aplikasi untuk mengambil keputusan.
Response adalah hasil akhir yang dikirim Laravel kembali ke client. Response bisa berupa HTML, JSON, redirect, file download, atau status code tertentu.
Validation adalah proses memeriksa input agar sesuai aturan sebelum data dipakai lebih jauh. Di Laravel, validation paling aman dijalankan di layer yang paling dekat dengan titik penggunaan input, biasanya di controller atau FormRequest, bukan di middleware umum.
Alur request di Laravel sering terlihat sederhana dari luar, padahal ada beberapa lapisan yang bekerja berurutan. Kalau urutannya tidak dipahami, masalah yang muncul biasanya tidak kelihatan dari error message saja:
Memahami flow ini penting supaya kamu tahu kapan suatu aturan perlu berada di middleware, kapan harus jadi validation, dan kapan cukup ditaruh di controller.
Urutan di atas menunjukkan gambaran praktisnya: middleware berjalan lebih dulu, lalu request sampai ke route dan controller, validation biasanya dipicu di dalam flow controller, dan response keluar melewati lapisan yang sama dalam arah balik.
Laravel menempatkan middleware sebagai semacam pemeriksa gerbang. Request tidak langsung masuk ke controller. Ia melewati middleware yang terdaftar secara global, lalu middleware route atau group jika ada.
Secara umum ada dua jenis perilaku middleware:
Middleware bisa memeriksa kondisi request dulu, misalnya:
Kalau syarat tidak terpenuhi, middleware bisa langsung mengembalikan response, misalnya redirect atau JSON error. Dalam kasus ini, controller tidak pernah dijalankan.
Middleware juga bisa melakukan sesuatu setelah controller menghasilkan response. Contohnya:
Di Laravel, pola ini umum dipakai untuk tugas lintas request, bukan logic bisnis spesifik fitur.
Validation idealnya dijalankan setelah request lolos dari middleware yang relevan, tetapi sebelum data dipakai untuk proses bisnis utama.
public function store(Request $request)
{
$validated = $request->validate([
'title' => ['required', 'string', 'max:255'],
'body' => ['required', 'string'],
]);
Ini cara yang cepat dan umum untuk endpoint sederhana.
public function store(StorePostRequest $request)
{
// data sudah tervalidasi
$validated = $request->validated();
}FormRequest lebih cocok kalau aturan validasi mulai banyak, dipakai ulang, atau perlu otorisasi terpisah.
Validation biasanya bukan tugas middleware umum karena validasi tergantung payload dan konteks fitur. Middleware yang terlalu dini sering belum punya konteks penuh tentang resource, relasi, atau rules spesifik domain.
Middleware cocok untuk memeriksa akses atau syarat global. Validation cocok untuk memeriksa bentuk dan isi input. Dua hal ini mirip, tapi bukan hal yang sama.
Response adalah hasil akhir yang dikirim ke client setelah semua proses selesai.
return view(...) untuk HTMLreturn response()->json(...) untuk APIreturn redirect(...) untuk alur form webreturn response()->download(...) untuk fileabort(403) atau abort(404) untuk kondisi error tertentuSetelah controller selesai, response melewati middleware dalam arah balik. Ini memberi kesempatan untuk:
Kalau middleware mengembalikan response lebih awal, response itu tetap keluar tanpa melewati controller. Karena itu, middleware harus dipakai dengan sadar: ia bisa menjadi gerbang, tetapi juga bisa memotong flow utama kalau terlalu agresif.
Dipakai untuk hal yang bersifat lintas request atau lintas route.
Contoh:
Dipakai untuk memastikan input valid sebelum diproses.
Contoh:
Dipakai untuk mengorkestrasi proses request.
Controller biasanya:
Kalau controller mulai penuh dengan aturan akses, normalisasi input, dan logic bisnis besar, biasanya itu tanda layer-nya sudah perlu dirapikan.
Middleware sering dipakai terlalu jauh. Padahal middleware bukan tempat ideal untuk business rule yang spesifik fitur.
Contoh jebakan:
Kalau logic itu hanya relevan untuk satu fitur, biasanya lebih jelas jika berada di controller, service, atau action class.
Validasi field request di middleware sering terasa praktis, tetapi biasanya membuat flow sulit dibaca. Middleware jadi terlalu umum, padahal rules input itu spesifik endpoint.
Akibatnya:
Middleware tidak dirancang untuk menjelaskan detail kesalahan input per field. Kalau kebutuhanmu adalah pesan validasi yang rapi dan terstruktur, FormRequest lebih tepat.
Middleware berjalan untuk setiap request yang melewatinya. Kalau ada query berat di sana, dampaknya bisa terasa ke banyak endpoint sekaligus.
Gunakan middleware hanya bila cek itu memang lintas endpoint dan biaya eksekusinya masuk akal.
Terlalu banyak middleware kecil yang saling bergantung membuat alur request susah dibaca. Biasanya lebih sehat kalau middleware dipakai untuk concern yang benar-benar horizontal, bukan untuk semua keputusan aplikasi.
Route::post('/posts', [PostController::class, 'store'])
->middleware(['auth', 'verified']);public function store(StorePostRequest $request)
{
$validated = $request->validated();
Post::create([
'title' => $validated['title'],
'body' => $validated['body'],
Flow ini sehat karena: