Middleware
Bayangkan kamu punya sebuah gedung kantor. Sebelum bisa masuk ke ruangan tertentu, kamu harus melewati satpam yang mengecek identitasmu.
Di Laravel, satpam itu namanya Middleware — kode yang berjalan sebelum (atau sesudah) request sampai ke controller-mu.
1. Cara Kerja Middleware
Browser → Request → [Middleware 1] → [Middleware 2] → Controller → Response
↓ ↓
Cek Login? Cek Role Admin?
✅ Lanjut ❌ Tolak (403)
Setiap request HTTP melewati satu atau lebih middleware sebelum mencapai tujuannya. Jika middleware menolak → request dihentikan dan user mendapat respons error atau redirect.
2. Middleware Bawaan Laravel
Laravel sudah menyediakan middleware yang sering dipakai:
Cara menggunakannya di route:
// routes/web.php
// Satu middleware
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware('auth');
// Beberapa middleware sekaligus
Route::get('/admin', [AdminController::class, 'index'])
->middleware(['auth', 'verified']);
// Grup route dengan middleware yang sama
Route::middleware(['auth'])->group(function () {
Route::get('/profil', [ProfilController::class, 'index']);
Route::get('/pesanan', [PesananController::class, 'index']);
Route::get('/pengaturan', [PengaturanController::class, 'index']);
});
3. Membuat Middleware Sendiri
Misalnya, kamu ingin membuat middleware yang hanya mengizinkan user dengan role admin.
Langkah 1: Buat middleware via Artisan:
php artisan make:middleware CekAdmin
Langkah 2: Tulis logikanya di app/Http/Middleware/CekAdmin.php:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CekAdmin
{
/**
* Handle an incoming request.
*/
public function handle(Request $request, Closure $next)
{
// Cek apakah user yang login punya role 'admin'
if (auth()->user()?->role !== 'admin') {
// Bukan admin? Tolak!
abort(403, 'Maaf, Anda tidak memiliki akses ke halaman ini.');
}
// Admin? Lanjutkan ke controller!
return $next($request);
}
}
Langkah 3: Daftarkan middleware di bootstrap/app.php (Laravel 11+):
// bootstrap/app.php
use App\Http\Middleware\CekAdmin;
return Application::configure(basePath: dirname(__DIR__))
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'admin' => CekAdmin::class,
]);
})
->create();
Langkah 4: Gunakan di route:
// routes/web.php
Route::middleware(['auth', 'admin'])->group(function () {
Route::get('/admin/dashboard', [AdminController::class, 'dashboard']);
Route::get('/admin/users', [AdminController::class, 'users']);
Route::delete('/admin/users/{id}', [AdminController::class, 'destroy']);
});
4. Middleware dengan Parameter
Middleware juga bisa menerima parameter. Contoh: cek apakah user punya role tertentu:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CekRole
{
public function handle(Request $request, Closure $next, string $role)
{
if (auth()->user()?->role !== $role) {
abort(403, "Akses ditolak. Role yang diperlukan: {$role}");
}
return $next($request);
}
}
Penggunaan di route:
// Hanya user dengan role 'editor' yang bisa akses
Route::get('/artikel/create', [ArtikelController::class, 'create'])
->middleware('role:editor');
// Hanya 'admin' yang bisa menghapus
Route::delete('/artikel/{id}', [ArtikelController::class, 'destroy'])
->middleware('role:admin');
5. Middleware Sebelum vs Sesudah
Middleware bisa berjalan sebelum request diproses (paling umum), atau sesudah response dibuat:
class SebelumMiddleware
{
public function handle(Request $request, Closure $next)
{
// ⬇️ Kode ini berjalan SEBELUM controller
// Contoh: cek login, cek role, log request
return $next($request); // Lanjut ke controller
}
}
class SesudahMiddleware
{
public function handle(Request $request, Closure $next)
{
$response = $next($request); // Controller dijalankan dulu
// ⬇️ Kode ini berjalan SESUDAH controller
// Contoh: tambah header, log response time
$response->header('X-Powered-By', 'Toko Keren');
return $response;
}
}
6. Contoh Nyata: Middleware Maintenance Mode
Buat middleware yang menampilkan halaman "Sedang Maintenance":
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class MaintenanceMode
{
public function handle(Request $request, Closure $next)
{
$isMaintenance = config('app.maintenance', false);
if ($isMaintenance && auth()->user()?->role !== 'admin') {
return response()->view('maintenance', [], 503);
}
return $next($request);
}
}
Admin tetap bisa akses situs, user biasa melihat halaman maintenance.
7. Perbandingan: PHP Native vs Laravel
Ingat Prinsipnya
Middleware = satpam yang berdiri di pintu.
- Mau cek login? Middleware.
- Mau cek role? Middleware.
- Mau batasi request? Middleware.
- Mau log setiap request? Middleware.
Jangan taruh logika pengecekan akses di dalam Controller — itu tugas Middleware!
Selanjutnya
Sekarang kamu paham bagaimana request difilter. Selanjutnya, pelajari cara membuat CRUD di Laravel dengan konvensi yang rapi menggunakan Resource Controller →.
Troubleshooting Terkait
Kalau middleware memunculkan error target class atau class not found, cek juga: