Status: experimental
Ini adalah helper untuk membuat aplikasi BANG menjadi REST.
Copy-paste kode dispatch_routes.php kedalam file app/helper.php (jangan lupa hapus <?php pada kode dispatch_routes ini).
Atau bisa juga buat file terpisah lalu di require pada file index.php aplikasi BANG kamu.
Cara manapun boleh.
Pada file index.php aplikasi BANG kamu, ubah bagian ini:
$module = get_request_path();Menjadi
$request = $_SERVER['REQUEST_METHOD'].' /'.get_request_path();
$module = dispatch_routes($request, [
'GET /welcome' => 'welcome', // hanya menerima request dengan method GET yg diarahkan ke module `welcome`
'GET|POST /user/:username' => 'user' // menerima request dengan method GET atau POST yg diarahkan ke module `user`
], [
'cache' => 'route-caches.txt'
]);Kode diatas adalah contoh mendaftarkan 2 buah route dimana route pertama akan mengakses modul 'welcome' jika aplikasi menerima request berupa GET ke path /welcome.
Dan route ke-2 mendaftarkan route yg akan mengakses ke modul 'user' jika aplikasi menerima request berupa GET atau POST ke path /user/:username dimana :username adalah parameter yang dapat bernilai kombinasi angka, huruf, karakter '-', atau '_'.
Untuk mencobanya, silahkan buat modul 'user' dengan membuat file app/module/user.php. Lalu isikan sebagai berikut:
<?php
global $_PARAM;
?>
<h1>Halo <?= $_PARAM['username'] ?></h1>Lalu akses browser ke url http://localhost/project-bang-kamu/index.php/user/johndoe.
Jika berhasil, browser akan menampilkan pesan 'Halo johndoe'.
Selanjutnya coba hapus GET pada GET|POST di route user tersebut, dan coba refresh browser.
Sekarang browsermu seharusnya akan menampilkan error 404 karena route tersebut tidak menerima GET request.
Metode yang digunakan pada router ini sama seperti yang saya buat pada rakit framework yang hasil benchmarknya saya post disini.
Teknik yang digunakan mirip-mirip seperti FastRoute, yakni mengelompokkan sebagian route kedalam sebuah regex, jadi tidak menyocokkan regex pada route 1/1.
Berikut hasil benchmark untuk router ini pada laptop Lenovo dengan prosesor AMD A10 saya:
# CASE 1: Benchmarking without cache
==========================================================
[bench] first route => 3.9417381286621ms
[bench] last route => 8.5415799617767ms
[bench] unknown route => 8.0575070381165ms
# CASE 2: Benchmarking within cache
==========================================================
[bench] first route => 2.8668539524078ms
[bench] last route => 3.3761830329895ms
[bench] unknown route => 2.9186360836029ms
pada benchmarking ini di test router melakukan 10.000 dispatching ke 50 routes untuk setiap testnya.