Menu Navigasi

Tutorial Tutorial Pemrograman Part 58: Memahami dan Mengimplementasikan Middleware di PHP

AI Generated
29 Desember 2025
17 views
Tutorial Tutorial Pemrograman Part 58: Memahami dan Mengimplementasikan Middleware di PHP

Pendahuluan

Selamat datang di Part 58 seri tutorial Tutorial Pemrograman Zero to Hero! Pada bagian ini, kita akan menyelami konsep Middleware di PHP. Middleware adalah komponen penting dalam membangun aplikasi web yang robust dan terstruktur dengan baik. Middleware memungkinkan Anda menyisipkan lapisan pemrosesan sebelum atau sesudah permintaan (request) mencapai handler (controller) utama Anda. Ini sangat berguna untuk autentikasi, otorisasi, logging, atau modifikasi request dan response.

Prasyarat:

  • Pemahaman dasar tentang PHP dan konsep pemrograman berorientasi objek (OOP).
  • Pengalaman dengan routing (misalnya, menggunakan framework seperti Laravel atau Symfony akan membantu, tetapi tidak wajib).
  • Pengetahuan tentang design patterns (khususnya Strategy Pattern).

Konsep Dasar Middleware

Bayangkan sebuah gedung perkantoran. Setiap orang yang masuk harus melewati resepsionis. Resepsionis memverifikasi identitas, memberikan izin, dan mencatat kunjungan. Middleware dalam aplikasi web berperan seperti resepsionis ini. Setiap permintaan (request) dari pengguna melewati middleware terlebih dahulu. Middleware dapat melakukan berbagai tugas, seperti memeriksa apakah pengguna sudah login, mencatat permintaan, atau bahkan memodifikasi permintaan sebelum mencapai controller yang menangani logika bisnis inti.

Contoh Analogis:

  • Autentikasi: Middleware memeriksa apakah pengguna sudah login sebelum mengizinkan akses ke halaman profil.
  • Logging: Middleware mencatat setiap permintaan yang masuk, termasuk IP address dan waktu akses.
  • Otorisasi: Middleware memeriksa apakah pengguna memiliki izin untuk mengakses sumber daya tertentu.
  • Modifikasi Request/Response: Middleware dapat mengubah data request (misalnya, memvalidasi input) atau memodifikasi response (misalnya, menambahkan header).

Hands-on Coding

Mari kita buat contoh sederhana implementasi middleware di PHP tanpa menggunakan framework. Kita akan membuat middleware untuk logging dan autentikasi.

1. Interface Middleware

Pertama, definisikan sebuah interface untuk middleware:


interface MiddlewareInterface {
    public function handle(Request $request, Closure $next): Response;
}

Interface ini mendefinisikan satu method, handle(), yang menerima objek Request dan sebuah Closure ($next). Closure ini akan menjalankan middleware berikutnya dalam rantai, atau controller utama jika ini adalah middleware terakhir.

2. Class Request dan Response (Sederhana)

Buat kelas sederhana untuk merepresentasikan Request dan Response.


class Request {
    public $uri;
    public $method;
    public $parameters;

    public function __construct(string $uri, string $method, array $parameters = []) {
        $this->uri = $uri;
        $this->method = $method;
        $this->parameters = $parameters;
    }
}

class Response {
    public $content;
    public $statusCode;

    public function __construct(string $content = '', int $statusCode = 200) {
        $this->content = $content;
        $this->statusCode = $statusCode;
    }

    public function send(): void {
        http_response_code($this->statusCode);
        echo $this->content;
    }
}

3. Implementasi Middleware Logging

Berikut adalah contoh implementasi middleware untuk logging:


use Psr\Log\LoggerInterface;

class LoggingMiddleware implements MiddlewareInterface {
    private $logger;

    public function __construct(LoggerInterface $logger) {
        $this->logger = $logger;
    }

    public function handle(Request $request, Closure $next): Response {
        $this->logger->info("Request received: " . $request->method . " " . $request->uri);
        $response = $next($request);
        $this->logger->info("Response sent with status code: " . $response->statusCode);
        return $response;
    }
}

Middleware ini mencatat informasi tentang request sebelum dan sesudah controller dijalankan. Perhatikan penggunaan `PSR LoggerInterface`. Jika anda belum memiliki implementasi, bisa menggunakan `Monolog`.

4. Implementasi Middleware Autentikasi

Berikut adalah contoh implementasi middleware untuk autentikasi:


class AuthenticationMiddleware implements MiddlewareInterface {
    public function handle(Request $request, Closure $next): Response {
        // Simulasi logika autentikasi
        if (!isset($_SESSION['user_id'])) {
            return new Response('Unauthorized', 401);
        }

        return $next($request);
    }
}

Middleware ini memeriksa apakah user_id ada di session. Jika tidak, middleware mengembalikan response 'Unauthorized' dengan status code 401.

5. Pipeline Middleware

Selanjutnya, kita perlu membuat mekanisme untuk menjalankan middleware secara berurutan (pipeline). Kita akan menggunakan Strategy Pattern


class MiddlewarePipeline {
    private $middlewares = [];

    public function add(MiddlewareInterface $middleware): void {
        $this->middlewares[] = $middleware;
    }

    public function process(Request $request, Closure $coreLogic): Response {
        $pipeline = array_reduce(
            array_reverse($this->middlewares),
            function ($nextMiddleware, $middleware) {
                return function ($request) use ($nextMiddleware, $middleware) {
                    return $middleware->handle($request, $nextMiddleware);
                };
            },
            $coreLogic
        );

        return $pipeline($request);
    }
}

Class `MiddlewarePipeline` menyimpan daftar middleware dan menyediakan method `process` yang menjalankan middleware secara berurutan, dari awal hingga akhir. Method `array_reduce` digunakan untuk membangun rantai eksekusi.

6. Contoh Penggunaan

Berikut adalah contoh penggunaan middleware:


use Psr\Log\NullLogger;

session_start();

// Inisialisasi Request
$request = new Request('/profile', 'GET');

// Contoh core logic (controller)
$coreLogic = function (Request $request): Response {
    return new Response('Welcome to your profile!', 200);
};

// Inisialisasi Middleware Pipeline
$pipeline = new MiddlewarePipeline();

// Tambahkan Middleware
$pipeline->add(new LoggingMiddleware(new NullLogger()));
$pipeline->add(new AuthenticationMiddleware());

// Jalankan Pipeline
$response = $pipeline->process($request, $coreLogic);

// Kirim Response
$response->send();

Kode di atas menunjukkan bagaimana middleware diinisialisasi dan ditambahkan ke pipeline. Kemudian, pipeline diproses dengan request dan controller (core logic). Terakhir, response dikirim ke browser.

Common Pittfalls

  • Urutan Middleware: Urutan middleware sangat penting. Misalnya, middleware autentikasi harus dijalankan sebelum middleware otorisasi.
  • Over-engineering: Jangan menambahkan middleware untuk setiap tugas kecil. Gunakan middleware hanya untuk logika yang dapat digunakan kembali dan berdampak besar pada aplikasi.
  • Performance: Setiap middleware menambahkan overhead. Pastikan middleware dioptimalkan untuk kinerja.
  • Tidak Menangani Exception: Pastikan middleware Anda menangani exception dengan baik dan memberikan pesan error yang informatif.

Challenge

Modifikasi contoh di atas untuk menambahkan middleware yang memvalidasi input request (misalnya, memastikan bahwa parameter 'email' adalah alamat email yang valid).

Sumber Referensi

Bagikan: