Pernah membuat halaman dashboard yang seharusnya hanya bisa diakses admin, tapi ternyata siapa pun yang tahu URL-nya bisa masuk? Di sinilah middleware berperan. Middleware adalah "lapisan penyaring" yang memeriksa setiap request sebelum sampai ke controller. Di artikel ini kamu akan belajar cara kerja middleware di Laravel dan membuat middleware sendiri untuk mengecek role pengguna โ lengkap dengan kode.
Apa Itu Middleware?
Analoginya seperti satpam di pintu gedung. Sebelum tamu masuk ke ruangan (controller), satpam (middleware) memeriksa dulu: apakah punya kartu akses? Sudah login? Punya izin? Kalau lolos, tamu dipersilakan masuk. Kalau tidak, diarahkan keluar (redirect) atau ditolak.
Setiap request di Laravel melewati rangkaian middleware sebelum mencapai logika utama. Contoh middleware bawaan Laravel: auth (memastikan user sudah login) dan throttle (membatasi jumlah request).
Cara Membuat Middleware
Gunakan perintah Artisan berikut:
php artisan make:middleware CheckRole
Perintah ini membuat file app/Http/Middleware/CheckRole.php. Isi method handle() adalah tempat logika pemeriksaan diletakkan:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CheckRole
{
public function handle(Request $request, Closure $next, string $role)
{
// Cek apakah user login dan role-nya sesuai
if (! $request->user() || $request->user()->role !== $role) {
abort(403, 'Anda tidak punya akses ke halaman ini.');
}
// Lolos pemeriksaan, lanjutkan request ke tujuan
return $next($request);
}
}
Perhatikan parameter ketiga $role โ ini memungkinkan kita mengirim nilai dinamis dari route (misalnya "admin" atau "editor").
Mendaftarkan Middleware
Agar bisa dipanggil lewat nama pendek, daftarkan alias-nya. Di Laravel 11, buka bootstrap/app.php:
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'role' => \App\Http\Middleware\CheckRole::class,
]);
})
Pada Laravel 10 ke bawah, alias didaftarkan di array $routeMiddleware dalam app/Http/Kernel.php.
Menerapkan Middleware ke Route
Sekarang lindungi route dengan mengirim parameter role:
// Hanya admin yang boleh masuk
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware('role:admin');
// Beberapa route sekaligus
Route::middleware('role:admin')->group(function () {
Route::get('/users', [UserController::class, 'index']);
Route::get('/settings', [SettingController::class, 'index']);
});
Tanda titik dua (role:admin) adalah cara mengirim parameter ke middleware. Nilai admin akan masuk ke variabel $role tadi.
Middleware "Before" vs "After"
Middleware bisa berjalan sebelum atau sesudah request diproses:
- Before โ logika dijalankan sebelum
return $next($request). Cocok untuk pemeriksaan akses (seperti contoh di atas). - After โ logika dijalankan setelahnya, memakai hasil response. Cocok untuk mencatat log atau menambah header.
public function handle(Request $request, Closure $next)
{
$response = $next($request); // proses dulu
$response->header('X-App', 'MyApp'); // baru modifikasi response
return $response;
}
Pertanyaan yang Sering Diajukan (FAQ)
Apa bedanya middleware global dan route middleware?
Middleware global berjalan pada semua request (misalnya penanganan CORS), sedangkan route middleware hanya berjalan pada route tertentu yang kamu tentukan.
Bisakah satu route punya banyak middleware?
Bisa. Gunakan array: ->middleware(['auth', 'role:admin']). Middleware dijalankan berurutan sesuai penulisannya.
Kenapa middleware saya tidak jalan?
Cek tiga hal: alias sudah didaftarkan, nama alias di route benar, dan jalankan php artisan optimize:clear karena route sering ter-cache.
Kesimpulan
Middleware adalah cara Laravel menyaring request sebelum mencapai controller โ ideal untuk otentikasi, pengecekan role, logging, dan pembatasan akses. Dengan satu middleware CheckRole, kamu bisa mengamankan seluruh area admin secara rapi tanpa mengulang kode pengecekan di tiap controller.
Selanjutnya, pelajari Cara Membuat Login dan Register di Laravel dengan Breeze untuk melengkapi sistem otentikasimu, dan Cara Mengatasi Error "Route [login] not defined" yang sering muncul saat memakai middleware auth.