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:
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:
Mari kita buat contoh sederhana implementasi middleware di PHP tanpa menggunakan framework. Kita akan membuat middleware untuk logging dan autentikasi.
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.
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;
}
}
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`.
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.
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.
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.
Modifikasi contoh di atas untuk menambahkan middleware yang memvalidasi input request (misalnya, memastikan bahwa parameter 'email' adalah alamat email yang valid).