Selamat datang di Part 48 dari seri tutorial pemrograman PHP Zero to Hero! Di part sebelumnya, kita sudah mempelajari tentang middleware. Sekarang, kita akan membahas advanced routing menggunakan regular expressions (regex). Routing adalah jantung dari setiap aplikasi web modern, memungkinkan kita untuk memetakan URL ke tindakan atau controller tertentu. Regex memberikan fleksibilitas yang tak tertandingi dalam mendefinisikan pola URL. Prasyarat untuk tutorial ini adalah pemahaman dasar tentang PHP, konsep routing, dan sedikit familiaritas dengan regular expressions.
Routing dalam aplikasi web dapat dianalogikan dengan sistem pengiriman surat. Setiap URL adalah alamat surat, dan routing berperan sebagai kantor pos yang mengarahkan surat tersebut ke penerima yang tepat (controller/action). Regular expressions (regex) adalah pola yang kita gunakan untuk mencocokkan alamat surat. Dengan regex, kita dapat membuat pola yang sangat fleksibel dan dinamis.
Regular expressions adalah urutan karakter yang mendefinisikan sebuah pola pencarian. Mereka sangat berguna untuk mencocokkan, mencari, dan memanipulasi teks berdasarkan pola tertentu. Contoh sederhana: ^/users/([0-9]+)$ akan mencocokkan URL yang dimulai dengan /users/ diikuti oleh satu atau lebih digit angka.
Mari kita bangun sebuah sistem routing sederhana yang menggunakan regular expressions.
index.php (Entry Point)Ini adalah file utama yang menangani semua permintaan.
<?php
// Autoload dependencies (assuming Composer)
require __DIR__ . '/vendor/autoload.php';
// Get the requested URL
$requestUrl = $_SERVER['REQUEST_URI'];
$requestMethod = $_SERVER['REQUEST_METHOD'];
// Define routes as an array of regex patterns and callbacks
$routes = [
'GET ^/users/([0-9]+)$' => function ($id) {
// Handle GET request for a specific user by ID
echo "Getting user with ID: " . $id;
},
'POST ^/users$' => function () {
// Handle POST request to create a new user
echo "Creating a new user";
},
'GET ^/$' => function () {
// Handle GET request for the homepage
echo "Welcome to the homepage!";
},
'GET ^/products/([a-zA-Z0-9-]+)$' => function ($slug) {
// Handle GET request for a specific product by slug
echo "Getting product with slug: " . $slug;
},
];
$routeFound = false;
foreach ($routes as $pattern => $callback) {
// Extract the HTTP method from the pattern
preg_match('/^(GET|POST|PUT|DELETE)\s+(.*)$/', $pattern, $matches);
$method = $matches[1];
$regex = $matches[2];
// Check if the HTTP method matches the request
if ($method === $requestMethod) {
if (preg_match('#' . $regex . '#', $requestUrl, $matches)) {
// Remove the full match from the matches array
array_shift($matches);
// Call the callback function with the captured parameters
call_user_func_array($callback, $matches);
$routeFound = true;
break; // Stop after the first match
}
}
}
if (!$routeFound) {
// Handle 404 Not Found
http_response_code(404);
echo "404 Not Found";
}
Penjelasan Kode:
require __DIR__ . '/vendor/autoload.php';: Mengimpor dependencies yang diinstal menggunakan Composer.$requestUrl = $_SERVER['REQUEST_URI'];: Mendapatkan URL yang diminta dari server.$routes: Array yang mendefinisikan routes. Setiap key adalah regular expression, dan value adalah callback function yang akan dieksekusi jika URL cocok dengan regex.preg_match('#' . $regex . '#', $requestUrl, $matches): Mencocokkan URL dengan regular expression. Jika cocok, hasilnya disimpan di array $matches.call_user_func_array($callback, $matches): Memanggil callback function dengan parameter yang diekstrak dari URL.http_response_code(404);: Mengirimkan kode status HTTP 404 jika tidak ada route yang cocok.Pastikan Anda sudah menginstal Composer. Jika belum, unduh dan instal dari getcomposer.org.
composer.json (opsional, jika menggunakan dependencies)Meskipun contoh kode di atas tidak memerlukan dependencies eksternal, ini adalah praktik yang baik untuk menyertakan file composer.json dalam proyek Anda.
{
"require": {
"php": ">=7.4"
}
}
., +, *, dll. dengan menggunakan backslash (\).Tambahkan route untuk menangani permintaan DELETE ke /users/{id} untuk menghapus user berdasarkan ID.