laravelmiddlewarerequestMenengah3 mnt baca

Middleware: Penjaga Request

Buat middleware kustom untuk cek role, bahasa, atau logging, dan daftarkan di Laravel 11.

Konsep middleware

Middleware adalah lapisan yang dilewati request sebelum sampai ke controller (dan response sebelum kembali ke user). Analogi: satpam gedung yang memeriksa setiap orang masuk. Contoh bawaan: auth (harus login), verified (email terverifikasi), throttle (rate limit).

Membuat middleware sendiri

Misalnya middleware yang hanya mengizinkan admin:

bash
php artisan make:middleware EnsureUserIsAdmin
php
// app/Http/Middleware/EnsureUserIsAdmin.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class EnsureUserIsAdmin
{
    public function handle(Request $request, Closure $next): Response
    {
        if (! $request->user()?->is_admin) {
            abort(403, 'Hanya admin yang boleh masuk.');
        }

        return $next($request); // lolos, lanjut ke berikutnya
    }
}

Kuncinya: panggil $next($request) untuk meneruskan, atau hentikan dengan abort() atau redirect.

Mendaftarkan di Laravel 11

Tidak ada lagi Kernel.php. Daftarkan alias di bootstrap/app.php:

php
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'admin' => \App\Http\Middleware\EnsureUserIsAdmin::class,
    ]);
})

Lalu pakai di route:

php
Route::middleware(['auth', 'admin'])->group(function () {
    Route::get('/admin', fn () => view('admin.dashboard'));
});

// Atau langsung di controller (Laravel 11+)
class AdminController extends Controller
{
    // daftarkan via attribute atau method middleware()
}

Middleware dengan parameter

Middleware bisa menerima argumen, misalnya cek role dinamis:

php
// app/Http/Middleware/CheckRole.php
public function handle(Request $request, Closure $next, string $role): Response
{
    if (! $request->user()?->hasRole($role)) {
        abort(403);
    }
    return $next($request);
}

// routes/web.php
Route::get('/keuangan', fn () => '...')->middleware('role:keuangan');

Catatan teknis: Middleware berjalan berurutan sesuai urutan pendaftaran. auth harus selalu sebelum middleware yang butuh user login (seperti admin), karena $request->user() akan null kalau belum lewat auth. Urutan yang salah adalah sumber bug 403 misterius yang sering bikin bingung.