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:

MiddlewareFungsiContoh Penggunaan
authCek apakah user sudah loginHalaman dashboard
guestCek apakah user BELUM loginHalaman login/register
verifiedCek apakah email sudah diverifikasiFitur premium
throttle:60,1Batasi request (rate limiting)Endpoint API
signedVerifikasi URL yang ditandatanganiLink reset password

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

AspekPHP NativeLaravel Middleware
Cek LoginCopy-paste if di setiap filemiddleware('auth') sekali di route
Cek Roleif ($_SESSION['role'] !== 'admin') di setiap filemiddleware('admin')
Rate LimitImplementasi manualmiddleware('throttle:60,1')
ReusabilityCopy-pasteTulis sekali, pakai di mana saja
UrutanSusah dikontrolStack middleware terurut
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: