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:
php artisan make:middleware EnsureUserIsAdmin// 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:
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'admin' => \App\Http\Middleware\EnsureUserIsAdmin::class,
]);
})Lalu pakai di route:
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:
// 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.
authharus selalu sebelum middleware yang butuh user login (sepertiadmin), karena$request->user()akan null kalau belum lewatauth. Urutan yang salah adalah sumber bug 403 misterius yang sering bikin bingung.