Cara Debug Middleware Laravel yang Tidak Jalan

Middleware Laravel seharusnya menjadi penjaga di depan controller. Saat middleware terasa "tidak jalan", gejalanya bisa bermacam-macam: route yang seharusnya terlindungi malah bisa diakses bebas, redirect login tidak pernah terjadi, atau logika pengecekan role terasa diabaikan.

Masalah ini hampir selalu ada di salah satu dari empat titik: middleware tidak terpasang ke route, alias middleware salah, logic handle() terlalu longgar, atau cache route/config belum sinkron setelah refactor.

Kapan Masalah Ini Biasanya Muncul?

  • Route admin tetap bisa diakses tanpa login
  • Middleware custom sudah dibuat, tetapi method handle() terasa tidak pernah dipanggil
  • Alias middleware seperti admin atau role selalu gagal dipakai
  • Route group seolah mengabaikan middleware yang sudah didefinisikan
  • Setelah refactor route, behavior middleware berubah aneh

Penyebab Paling Umum

1. Middleware Tidak Benar-Benar Dipasang ke Route

<?php

Route::get('/admin', [AdminController::class, 'index']);

Kalau route tidak memakai ->middleware('auth') atau group yang relevan, middleware memang tidak akan pernah jalan.

2. Alias Middleware Salah atau Belum Didaftarkan

Di Laravel 11+, alias middleware custom biasanya didaftarkan di bootstrap/app.php:

<?php

use App\Http\Middleware\CekAdmin;

->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'admin' => CekAdmin::class,
    ]);
})

Kalau alias admin belum ada, route ->middleware('admin') tidak akan bekerja seperti yang kamu harapkan.

3. Logic di handle() Selalu Meloloskan Request

Contoh:

<?php

public function handle(Request $request, Closure $next)
{
    return $next($request);
}

Secara teknis middleware "jalan", tetapi tidak melakukan pengecekan apa pun.

4. Route yang Diuji Ternyata Bukan Route yang Kamu Kira

Kadang ada route lain yang bentrok atau prefix berbeda, sehingga request masuk ke route lain yang tidak memakai middleware.

5. Cache Route atau Config Belum Dibersihkan

Setelah rename middleware, alias, atau group route, cache lama bisa membuat hasil debug terasa membingungkan.

Langkah Diagnosis

  1. Jalankan php artisan route:list dan pastikan route target benar-benar memakai middleware yang kamu kira.
  2. Cek alias middleware di bootstrap/app.php.
  3. Tambahkan log sementara di awal method handle() untuk memastikan middleware benar-benar terpanggil.
  4. Periksa apakah route berada di file yang benar:
    • routes/web.php untuk halaman web
    • routes/api.php untuk endpoint API
  5. Bersihkan cache setelah perubahan besar di routing atau middleware.
Jangan Langsung Menyalahkan Logic-nya

Sebelum mengutak-atik isi handle(), pastikan dulu middleware benar-benar terpasang di route yang sedang kamu uji.

Langkah Fix

1. Pasang Middleware ke Route atau Group

<?php

Route::middleware(['auth', 'admin'])->group(function () {
    Route::get('/admin/dashboard', [AdminController::class, 'dashboard']);
});

2. Daftarkan Alias dengan Benar

<?php

use App\Http\Middleware\CekAdmin;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->alias([
            'admin' => CekAdmin::class,
        ]);
    })
    ->create();

3. Tulis Logic handle() yang Tegas

<?php

public function handle(Request $request, Closure $next)
{
    if (auth()->user()?->role !== 'admin') {
        abort(403, 'Akses ditolak.');
    }

    return $next($request);
}

4. Tambahkan Logging Sementara

<?php

use Illuminate\Support\Facades\Log;

public function handle(Request $request, Closure $next)
{
    Log::info('Middleware CekAdmin dipanggil', [
        'url' => $request->fullUrl(),
        'user_id' => auth()->id(),
    ]);

    return $next($request);
}

5. Bersihkan Cache

php artisan optimize:clear

Contoh Sebelum dan Sesudah

Sebelum

<?php

Route::get('/admin/dashboard', [AdminController::class, 'dashboard']);

Middleware custom sudah dibuat, tetapi route belum memakainya sama sekali.

Sesudah

<?php

Route::middleware(['auth', 'admin'])->group(function () {
    Route::get('/admin/dashboard', [AdminController::class, 'dashboard']);
});

Error Umum

Middleware Tidak Pernah Dipanggil

Biasanya route belum memakai middleware itu, atau request masuk ke route yang berbeda.

Middleware Dipanggil, Tapi User Tetap Bisa Lolos

Periksa logic if di handle(). Sering kali pengecekan role, guard, atau kondisi login tidak setegas yang dibayangkan.

Alias Middleware Tidak Dikenali

Biasanya alias belum didaftarkan, salah eja, atau cache aplikasi belum dibersihkan.

Pencegahan

  1. Setelah menambah middleware, cek hasil route:list.
  2. Pakai nama alias yang pendek dan konsisten, misalnya admin atau role.
  3. Jangan biarkan handle() langsung return $next($request) sebelum pengecekan penting.
  4. Setelah refactor routing, jalankan optimize:clear.
  5. Tulis feature test untuk memastikan route benar-benar terlindungi.

Bacaan Terkait

FAQ

Kenapa middleware saya jalan di browser, tetapi tidak di Postman?

Kemungkinan route web dan route API memakai guard atau mekanisme auth yang berbeda.

Apakah middleware custom wajib didaftarkan?

Kalau ingin dipakai lewat alias seperti ->middleware('admin'), iya, alias-nya harus didaftarkan lebih dulu.

Perlukah pakai dd() di middleware saat debug?

Boleh untuk cek cepat, tetapi logging biasanya lebih aman karena tidak memutus alur request secara total.