Memahami Middleware pada Laravel

 

1. Apa Itu Middleware?

Secara teknis, Middleware adalah lapisan (layer) perantara yang berada di antara HTTP Request (permintaan masuk) dan Aplikasi inti (Core Application) Anda.

Ketika seorang pengguna mengirimkan permintaan ke server (misalnya mengakses URL /dashboard), permintaan itu tidak langsung diproses oleh controller. Ia akan melewati serangkaian middleware terlebih dahulu. Middleware inilah yang akan memutuskan:

  • Apakah permintaan ini boleh diteruskan ke controller?

  • Apakah permintaan ini harus diubah atau dimodifikasi?

  • Apakah permintaan ini harus ditolak dan dikembalikan ke halaman lain?

Secara sederhana, alur kerjanya adalah:


Gambar 1. Alur Kerja Middleware

Begini alur kerja middleware di Laravel:
  1. Request masuk – client mengirim HTTP request ke aplikasi.
  2. HTTP kernel (App\Http\Kernel) menentukan middleware mana saja yang perlu dijalankan, baik global maupun yang spesifik ke route.
  3. Middleware global dijalankan lebih dulu untuk semua request, contohnya TrimStrings, TrustProxies, atau ValidatePostSize.
  4. Middleware route dijalankan berikutnya, khusus untuk route yang mendefinisikannya — misalnya auth, throttle, atau middleware custom yang didaftarkan lewat $middlewareAliases atau langsung di route/group.
  5. Jika semua middleware "before" lolos (tidak melakukan return lebih awal), request diteruskan ke controller untuk diproses.
  6. Controller mengembalikan response.
  7. Response tersebut melewati middleware lagi secara terbalik — di sinilah bagian after middleware dieksekusi (kode setelah $next($request)), misalnya untuk menambahkan header atau melakukan logging.

2. Mengapa Middleware Penting?

Middleware adalah tulang punggung keamanan dan efisiensi dalam aplikasi Laravel. Berikut beberapa fungsi utamanya:

FungsiDeskripsiContoh Kasus
AutentikasiMemastikan pengguna sudah login sebelum mengakses halaman tertentu.Halaman dashboard hanya boleh diakses oleh pengguna yang sudah login.
OtorisasiMemeriksa apakah pengguna yang sudah login memiliki izin (role/permission) tertentu.Halaman admin/panel hanya boleh diakses oleh user dengan role admin.
Validasi DasarMemeriksa data awal permintaan sebelum masuk ke controller.Mengecek apakah request mengandung header X-API-KEY yang valid.
Logging & MonitoringMencatat setiap permintaan yang masuk untuk keperluan audit.Mencatat IP, waktu, dan URL yang diakses oleh setiap pengguna.
Modifikasi DataMengubah atau menambahkan data pada request sebelum diteruskan.Menambahkan timestamp pada semua data yang masuk, atau mengubah format input.
Rate LimitingMembatasi jumlah permintaan dari satu IP dalam waktu tertentu.Mencegah serangan brute-force pada halaman login.

3. Jenis-Jenis Middleware di Laravel

Secara garis besar, middleware di Laravel terbagi menjadi dua jenis berdasarkan cara pendaftarannya:

A. Global Middleware

Middleware ini akan berjalan pada setiap HTTP request yang masuk ke aplikasi, tanpa terkecuali. Ini seperti penjaga gerbang utama istana yang memeriksa semua tamu, baik yang mau ke ruang publik maupun ruang VIP.

  • Contoh bawaan Laravel:

    • TrustHosts (untuk keamanan)

    • PreventRequestsDuringMaintenance (saat mode pemeliharaan)

  • Lokasi pendaftaran: app/Http/Kernel.php di dalam properti $middleware.

B. Route Middleware

Middleware ini hanya berjalan pada route atau grup route tertentu yang kita tentukan. Ini seperti penjaga khusus yang hanya bertugas di pintu ruang VIP. Kita bisa memasangnya di route mana pun yang membutuhkan filter khusus.

  • Contoh bawaan Laravel:

    • auth (memastikan user login)

    • guest (memastikan user belum login)

    • admin (memastikan user adalah admin)

    • throttle (membatasi jumlah request)

  • Lokasi pendaftaran: app/Http/Kernel.php di dalam properti $routeMiddleware. Kita juga bisa mendaftarkan middleware buatan sendiri di sini.


4. Bagaimana Cara Membuat Middleware Sendiri?

Laravel memudahkan kita untuk membuat middleware kustom dengan perintah Artisan. Mari kita buat middleware bernama CheckAge yang hanya memperbolehkan pengguna berusia di atas 17 tahun mengakses halaman tertentu.

Langkah 1: Buat Middleware

Jalankan perintah berikut di terminal:

bash
php artisan make:middleware CheckAge
File baru akan dibuat di app/Http/Middleware/CheckAge.php. Di dalamnya terdapat metode handle.
Langkah 2: Isi Logika Middleware
Buka file tersebut dan ubah metode handle-nya:
php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckAge
{
    /**
     * Handle an incoming request.
     */
    public function handle(Request $request, Closure $next)
    {
        // Ambil parameter 'age' dari request (misal dari query string atau form)
        $age = $request->input('age');

        // Jika usia kurang dari 17, tolak akses
        if ($age < 17) {
            return redirect('/home')->with('error', 'Maaf, akses hanya untuk usia 17 tahun ke atas.');
        }

        // Jika lolos, lanjutkan ke controller berikutnya
        return $next($request);
    }
}

Penjelasan:

  • $request: Objek yang membawa semua data permintaan.

  • $next: Sebuah closure yang bertugas melanjutkan permintaan ke middleware berikutnya atau ke controller. Jika kita memanggil return $next($request);, artinya kita mengizinkan permintaan tersebut.

  • Jika kita tidak memanggil $next dan langsung mengembalikan redirect atau response, maka proses akan berhenti dan tidak sampai ke controller.

5. Mendaftarkan dan Menggunakan Middleware

Setelah dibuat, kita harus mendaftarkan middleware agar Laravel mengenalinya. Buka file
app/Http/Kernel.php.

A. Daftarkan sebagai Route Middleware (Direkomendasikan)

Tambahkan middleware baru kita ke dalam array $routeMiddleware:
php
protected $routeMiddleware = [
    // ... middleware bawaan lainnya
    'auth' => \App\Http\Middleware\Authenticate::class,
    'age.check' => \App\Http\Middleware\CheckAge::class, // <-- Daftarkan di sini
];

B. Gunakan pada Route

Sekarang kita bisa menggunakan middleware age.check pada route di file routes/web.php:

Contoh 1: Single Route

php
Route::get('/dashboard-age', function () {
    return view('dashboard');
})->middleware('age.check');

Contoh 2: Group Route

php
Route::middleware(['auth', 'age.check'])->group(function () {
    Route::get('/profile', [ProfileController::class, 'index']);
    Route::get('/settings', [SettingsController::class, 'index']);
});

Pada contoh di atas, semua route dalam grup akan melewati middleware auth dulu, kemudian age.check.

6. Parameter pada Middleware

Middleware juga bisa menerima parameter tambahan. Misalnya, kita ingin middleware CheckRole yang bisa menerima peran apa yang diizinkan.
php
// Di dalam middleware
public function handle(Request $request, Closure $next, $role)
{
    if (auth()->user()->role !== $role) {
        abort(403, 'Unauthorized');
    }
    return $next($request);
}
Saat mendaftarkan di route, kita bisa mengirimkan parameternya:
php
Route::get('/admin', function () {
    // ...
})->middleware('role:admin'); // Mengirimkan parameter 'admin'

7. Terminable Middleware (Middleware yang Berjalan Setelah Response)

Ada satu jenis middleware khusus yang disebut Terminable Middleware. Middleware ini memiliki metode terminate() yang akan dijalankan setelah response dikirim ke browser. Ini sangat berguna untuk tugas-tugas berat seperti:

  • Menyimpan log ke database.

  • Mengirim notifikasi atau email.

  • Membersihkan cache sementara.

Contoh:
php
class LogRequestMiddleware
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Log aktivitas setelah response dikirim
        Log::info('Request selesai diproses');
    }
}

8. Best Practice dalam Menggunakan Middleware

Agar aplikasi Anda rapi dan mudah dikelola, ikuti beberapa tips berikut:
  1. Jaga Middleware Tetap Ringan: Middleware berjalan di setiap request, jadi hindari operasi yang berat (seperti query database kompleks) jika tidak perlu. Pindahkan logika berat ke controller atau job queue.
  2. Satu Tugas, Satu Middleware: Buat middleware yang spesifik untuk satu tugas. Jangan membuat middleware yang menangani autentikasi sekaligus logging. Pisahkan menjadi auth dan log.
  3. Urutan Itu Penting: Urutan middleware di dalam grup menentukan prioritasnya. Pastikan middleware autentikasi (auth) berjalan sebelum middleware otorisasi (admin), karena kita perlu tahu siapa user-nya sebelum memeriksa perannya.
Gunakan Terminable untuk Non-Blokir: Manfaatkan terminate() untuk tugas yang tidak perlu memperlambat response, seperti logging atau analytics.

9. Kesimpulan

Middleware di Laravel adalah mekanisme yang elegan dan kuat untuk memfilter, memvalidasi, dan memodifikasi HTTP Request sebelum mencapai inti aplikasi. Dengan menggunakan middleware, Anda dapat:

  • Menjaga keamanan dengan autentikasi dan otorisasi.

  • Meningkatkan keteraturan kode dengan memisahkan logika filtering dari controller.

  • Mengelola alur permintaan secara terpusat dan terstruktur.

Memahami middleware adalah langkah penting untuk menjadi developer Laravel yang handal. Jadi, jangan anggap remeh "penjaga gerbang" ini. Mereka adalah pahlawan tanpa tanda jasa yang membuat aplikasi Anda aman, efisien, dan terorganisir dengan baik.


Post a Comment for "Memahami Middleware pada Laravel"