Laravel Middleware Request Response Validation Flow
Definisi
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.
Kenapa penting
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:
- request ditolak terlalu dini oleh middleware
- validation dijalankan di tempat yang kurang tepat
- controller menerima data yang belum siap pakai
- response berubah tanpa sengaja di middleware
- logic bisnis dipindahkan ke middleware padahal seharusnya ada di service atau controller
Memahami flow ini penting supaya kamu tahu kapan suatu aturan perlu berada di middleware, kapan harus jadi validation, dan kapan cukup ditaruh di controller.
Alur request secara ringkas
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.
Cara kerja request melewati middleware
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:
1. Sebelum request diteruskan
Middleware bisa memeriksa kondisi request dulu, misalnya:
- user sudah login atau belum
- token valid atau tidak
- locale perlu di-set atau tidak
- header tertentu ada atau tidak
- apakah request berasal dari client yang diizinkan
Kalau syarat tidak terpenuhi, middleware bisa langsung mengembalikan response, misalnya redirect atau JSON error. Dalam kasus ini, controller tidak pernah dijalankan.
2. Setelah request diproses
Middleware juga bisa melakukan sesuatu setelah controller menghasilkan response. Contohnya:
- menambahkan header
- memodifikasi response tertentu
- logging
- cleanup ringan
- mengukur durasi request
Di Laravel, pola ini umum dipakai untuk tugas lintas request, bukan logic bisnis spesifik fitur.
Kapan validation dijalankan
Validation idealnya dijalankan setelah request lolos dari middleware yang relevan, tetapi sebelum data dipakai untuk proses bisnis utama.
Lokasi yang paling umum
1. Di controller
public function store(Request $request)
{
$validated = $request->validate([
'title' => ['required', 'string', 'max:255'],
'body' => ['required', 'string'],
]);
// lanjut simpan data
}Ini cara yang cepat dan umum untuk endpoint sederhana.
2. Di FormRequest
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 bukan middleware umum
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.
Urutan praktis yang sehat
- request masuk
- middleware memeriksa akses atau kondisi umum
- route menentukan endpoint
- controller atau FormRequest menjalankan validation
- logic bisnis berjalan jika input valid
- response dibentuk
Response keluar dari Laravel
Response adalah hasil akhir yang dikirim ke client setelah semua proses selesai.
Bentuk response yang umum
return view(...)untuk HTMLreturn response()->json(...)untuk APIreturn redirect(...)untuk alur form webreturn response()->download(...)untuk fileabort(403)atauabort(404)untuk kondisi error tertentu
Response dan middleware
Setelah controller selesai, response melewati middleware dalam arah balik. Ini memberi kesempatan untuk:
- menambahkan header keamanan
- mengubah cache policy
- logging response
- menyesuaikan output akhir
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.
Perbedaan middleware, validation, dan controller
Middleware
Dipakai untuk hal yang bersifat lintas request atau lintas route.
Contoh:
- auth
- throttle
- set locale
- cek role
- cek signature
Validation
Dipakai untuk memastikan input valid sebelum diproses.
Contoh:
- field wajib ada
- format email benar
- panjang string sesuai
- file sesuai tipe dan ukuran
- relasi atau referensi input masih valid
Controller
Dipakai untuk mengorkestrasi proses request.
Controller biasanya:
- menerima request
- memanggil validation bila perlu
- memanggil service atau model
- menentukan response
Kalau controller mulai penuh dengan aturan akses, normalisasi input, dan logic bisnis besar, biasanya itu tanda layer-nya sudah perlu dirapikan.
Jebakan umum saat memindahkan logic ke middleware
1. Memindahkan logic bisnis ke middleware
Middleware sering dipakai terlalu jauh. Padahal middleware bukan tempat ideal untuk business rule yang spesifik fitur.
Contoh jebakan:
- menghitung harga
- memutuskan status order
- membuat keputusan domain yang kompleks
- query berat yang hanya dipakai satu endpoint
Kalau logic itu hanya relevan untuk satu fitur, biasanya lebih jelas jika berada di controller, service, atau action class.
2. Menaruh validation di middleware
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:
- error handling jadi kurang jelas
- pesan validasi sulit disesuaikan
- logic validation tersebar
- reuse validation berkurang
3. Mengandalkan middleware untuk data yang sudah seharusnya divalidasi di FormRequest
Middleware tidak dirancang untuk menjelaskan detail kesalahan input per field. Kalau kebutuhanmu adalah pesan validasi yang rapi dan terstruktur, FormRequest lebih tepat.
4. Menulis query berat di middleware
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.
5. Membuat middleware terlalu banyak
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.
Contoh flow yang sehat
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'],
'user_id' => $request->user()->id,
]);
return redirect()->route('posts.index');
}Flow ini sehat karena:
- middleware menangani akses umum
- FormRequest menangani validation
- controller mengorkestrasi proses
- model/service menangani penyimpanan atau logic domain
Catatan implementasi
- Pakai middleware untuk aturan lintas request, bukan untuk semua jenis pemeriksaan.
- Pakai validation di titik paling dekat dengan penggunaan input.
- Kalau logic mulai terasa seperti keputusan bisnis, jangan dipaksa masuk middleware.
- Jaga controller tetap tipis: fokus pada orchestration, bukan semua detail.
- Jika ada response yang dimodifikasi di middleware, pastikan efek sampingnya jelas.
- Gunakan FormRequest saat rules mulai banyak atau perlu dipakai ulang.
Istilah
- Middleware: lapisan di antara request dan controller, serta di antara response dan client.
- Request: data masuk dari client ke Laravel.
- Response: data keluar dari Laravel ke client.
- Validation: pengecekan input sebelum diproses.
- FormRequest: kelas Laravel untuk menyusun validation dan otorisasi request.
- Controller: lapisan yang mengatur alur request ke logic aplikasi.
Referensi terkait
- Dokumentasi resmi Laravel: Middleware
- Dokumentasi resmi Laravel: Validation
- Dokumentasi resmi Laravel: Requests
- Dokumentasi resmi Laravel: Controllers