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.