Middleware Laravel dan Cara Kerjanya

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 pe...

Middleware Laravel dan Cara Kerjanya

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.

Yudhi
Ditulis oleh
Yudhi
Founder & Lead Developer, GudangCode

Yudhi adalah founder GudangCode dan developer Laravel dengan pengalaman membangun puluhan sistem informasi bisnis siap pakai — mulai dari POS, HRIS, hingga aplikasi manajemen. Ia menulis panduan dan artikel di GudangCode untuk membantu developer Indonesia menjalankan, memahami, dan men-deploy source code Laravel dengan benar.

Laravel PHP MySQL Sistem Informasi Bisnis
Lihat semua artikel Yudhi
Mau source code & aplikasi lengkapnya?

Daftar gratis untuk mengunduh aplikasi bisnis, sistem informasi, dan source code Laravel siap pakai.

Daftar Gratis & Download
Middleware Laravel Programming & Laravel
📚 Free Learning Hub

Learn Coding for Free at DhieCoderWeb

Explore Laravel, PHP, JavaScript tutorials, source code, web development guides, and practical programming tips.

DhieCoderWeb
100+
Tutorials
Free
Learning
SEO
Tips
Visit Dhiecoderweb.com →

Dapatkan Akses Penuh Sekarang!

Bergabunglah menjadi member kami dan dapatkan akses eksklusif ke seluruh fitur unggulan aplikasi ini. Proses cepat, mudah, dan langsung bisa Anda gunakan.

Daftar Members Sekarang
Tim Support
Online
Isi data dulu untuk mulai chat:
Beri rating & testimoni sebelum menutup:
Live chat by gudangcode.com