Middleware adalah lapisan filter yang dilewati setiap HTTP request sebelum sampai ke controller, dan setiap response sebelum dikirim kembali ke pengguna. Anggap saja seperti pos pemeriksaan: Anda bisa memeriksa apakah pengguna sudah login, apakah punya izin, mencatat log, atau mengubah bahasa aplikasi — semuanya di satu tempat, tanpa mengotori controller. Artikel ini menjelaskan cara kerja middleware di Laravel 10/11 lengkap dengan contoh nyata.
1. Posisi Middleware dalam Siklus Request
Ketika request masuk, Laravel menjalankannya melalui rangkaian middleware secara berlapis (seperti bawang). Alurnya kira-kira: Request masuk → middleware global → middleware group/route → controller → response → middleware (arah balik) → Response keluar. Karena strukturnya berlapis, satu middleware bisa menjalankan kode sebelum request diteruskan dan sesudah response dibuat.
2. Membuat Middleware
Gunakan perintah artisan berikut untuk membuat kerangka middleware:
php artisan make:middleware EnsureUserIsActive
File baru muncul di app/Http/Middleware/EnsureUserIsActive.php dengan satu method handle(). Parameter $next adalah closure yang meneruskan request ke lapisan berikutnya:
public function handle(Request $request, Closure $next): Response
{
if (! $request->user() || ! $request->user()->is_active) {
return redirect('/login')
->with('error', 'Akun Anda tidak aktif.');
}
return $next($request);
}
Kunci pemahamannya: jika Anda memanggil return $next($request), request lanjut ke controller. Jika Anda return redirect() atau abort() lebih dulu, request dihentikan di sini.
3. Mendaftarkan Middleware
Cara mendaftarkan berbeda antara Laravel 10 dan 11. Di Laravel 11, semua pendaftaran dilakukan di bootstrap/app.php:
->withMiddleware(function (Middleware $middleware) {
// alias untuk dipakai per-route
$middleware->alias([
'active' => \App\Http\Middleware\EnsureUserIsActive::class,
]);
// middleware global (berjalan untuk semua request)
$middleware->append(\App\Http\Middleware\LogRequests::class);
})
Di Laravel 10, pendaftaran dilakukan di app/Http/Kernel.php lewat properti $middlewareAliases, $middleware (global), dan $middlewareGroups.
Menerapkan ke Route
Setelah dialias, tempelkan ke route atau grup route:
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware(['auth', 'active']);
Route::middleware(['auth', 'active'])->group(function () {
Route::resource('products', ProductController::class);
});
4. Before vs After Middleware
Perbedaannya terletak pada kapan logika Anda berjalan relatif terhadap $next($request).
Before middleware menjalankan kode sebelum request diteruskan — cocok untuk pemeriksaan izin:
public function handle(Request $request, Closure $next): Response
{
// kode di sini berjalan SEBELUM controller
Log::info('Request masuk: '.$request->path());
return $next($request);
}
After middleware menjalankan kode setelah response terbentuk — cocok untuk menambah header atau mencatat status:
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
// kode di sini berjalan SETELAH controller
$response->headers->set('X-App-Version', '1.0');
return $response;
}
5. Middleware dengan Parameter
Middleware bisa menerima argumen — pola paling umum adalah gerbang berbasis peran (role gate). Tambahkan parameter setelah $next:
public function handle(Request $request, Closure $next, string $role): Response
{
if ($request->user()->role !== $role) {
abort(403, 'Anda tidak punya akses.');
}
return $next($request);
}
Kirim parameter dari route menggunakan tanda titik dua:
Route::get('/admin', [AdminController::class, 'index'])
->middleware('role:admin');
Butuh beberapa nilai? Pisahkan dengan koma: middleware('role:admin,editor') lalu tangkap dengan ...$roles.
6. Contoh Nyata: Middleware Locale
Middleware sangat berguna untuk mengganti bahasa aplikasi berdasarkan preferensi pengguna atau parameter URL. Contoh sederhana:
public function handle(Request $request, Closure $next): Response
{
$locale = $request->query('lang', session('locale', 'id'));
if (in_array($locale, ['id', 'en'])) {
app()->setLocale($locale);
session(['locale' => $locale]);
}
return $next($request);
}
Daftarkan sebagai middleware global atau di grup web agar setiap halaman menghormati pilihan bahasa pengguna.
7. Kesalahan Umum yang Perlu Dihindari
- Lupa
return $next($request): request tidak pernah sampai ke controller dan Anda hanya melihat halaman kosong. - Menaruh logika berat di middleware global: karena berjalan di setiap request, query database di sana bisa memperlambat seluruh aplikasi.
- Salah urutan: middleware auth harus berjalan sebelum middleware yang mengakses
$request->user(), jika tidak akan bernilai null.
Dengan memahami middleware, Anda punya alat kuat untuk memisahkan urusan keamanan, logging, dan transformasi request dari logika bisnis. Controller Anda tetap ramping, dan aturan lintas-fitur terpusat di satu tempat yang mudah diuji.
Contoh Penggunaan Middleware
Middleware sangat berguna untuk memusatkan logika yang berulang di banyak rute. Contoh paling umum adalah pemeriksaan autentikasi, memastikan hanya pengguna yang sudah masuk dapat mengakses halaman tertentu. Middleware juga dipakai untuk otorisasi peran, membatasi laju permintaan, mencatat log, memaksa HTTPS, hingga mengatur bahasa aplikasi berdasarkan preferensi pengguna. Dengan menempatkan logika ini di middleware, kode controller tetap bersih dan fokus pada tugas utamanya. Anda dapat menerapkan middleware secara global untuk seluruh permintaan, per grup rute, atau pada rute tertentu saja sesuai kebutuhan. Urutan middleware juga penting karena menentukan alur pemrosesan permintaan. Manfaatkan middleware bawaan yang sudah tersedia sebelum membuat sendiri, dan buat middleware kustom hanya untuk kebutuhan yang benar-benar spesifik. Dengan pemahaman ini, Anda dapat menjaga aplikasi tetap terstruktur, aman, dan mudah dipelihara.
Pertanyaan Umum (FAQ)
Kapan memakai middleware global vs per rute? Gunakan global untuk hal yang berlaku ke semua permintaan seperti keamanan dasar, dan per rute untuk aturan spesifik seperti pemeriksaan peran tertentu.
Apakah urutan middleware berpengaruh? Ya. Urutan menentukan alur pemrosesan, misalnya autentikasi harus berjalan sebelum otorisasi peran agar logikanya benar.
Bolehkah satu rute punya banyak middleware? Boleh. Anda dapat menumpuk beberapa middleware pada satu rute sesuai kebutuhan pemrosesan permintaan tersebut.