yang mengatakan, hari ini kita akan melihat cara menggunakannya dan bagaimana untuk melaksanakan ciri -cirinya dalam projek sampel. Juga, kita akan melihat apa yang ada di bawah tudung: PHROUTE adalah hasil daripada banyak eksperimen dan ujian oleh orang yang berlainan.
mari kita mulakan dengan memasangnya!
Takeaways Key
Projek Contoh dan Contoh Pertama
{ "require": { "phroute/phroute": "1.*" } }
Untuk pemahaman yang lebih baik tentang setiap konsep PHROUTE, adalah idea yang baik untuk mempunyai projek sampel untuk bekerja dengan. Hari ini kita akan membuat API asas untuk perkhidmatan pangkalan data buku.
Jika anda ingin melakukan beberapa ujian, ini adalah pembuangan skema SQL yang saya gunakan (dengan beberapa data dummy tambahan).
Kami tidak akan menulis sesuatu yang sangat rumit. Sebenarnya, menulis beberapa laluan untuk mencontohi permintaan API dengan cara yang sangat asas akan mencukupi. Sekiranya anda ingin menulis API dunia sebenar terdapat banyak konsep yang perlu anda ketahui, tetapi hari ini kita hanya melihat Phroute.
Sebelum kita memulakan dengan laluan tertentu, mari kita menganalisis struktur aplikasi utama. Inilah yang akan kita masukkan ke dalam fail index.php kami.
<span>CREATE TABLE IF NOT EXISTS authors (id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(250) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; </span> <span>INSERT INTO authors (id, name) </span> <span>VALUES </span> <span>(1, 'Dan Brown'), </span> <span>(2, 'Paulo Coelho'); </span> <span>CREATE TABLE IF NOT EXISTS categories (id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(250) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; </span> <span>INSERT INTO categories (id, name) </span> <span>VALUES </span> <span>(1, 'Thriller'), </span> <span>(2, 'Novel'); </span> <span>CREATE TABLE IF NOT EXISTS books (id int(10) unsigned NOT NULL AUTO_INCREMENT, title varchar(250) NOT NULL, isbn varchar(50) NOT NULL, year int(11) NOT NULL, pages int(11) NOT NULL, author_id int(10) unsigned NOT NULL, category_id int(10) unsigned NOT NULL, PRIMARY KEY (id), KEY author_id (author_id,category_id), KEY category_id (category_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7; </span> <span>INSERT INTO books (id, title, isbn, year, pages, author_id, category_id) </span> <span>VALUES </span> <span>(1, 'The Zahir', '0-06-083281-9', 2005, 336, 2, 2), </span> <span>(2, 'The Devil and Miss Prym', '0-00-711605-5', 2000, 205, 2, 2), </span> <span>(3, 'The Alchemist', '0-06-250217-4', 1988, 163, 2, 2), </span> <span>(4, 'Inferno', '978-0-385-53785-8', 2013, 480, 1, 1), </span> <span>(5, 'The Da Vinci Code', '0-385-50420-9', 2003, 454, 1, 1), </span> <span>(6, 'Angels & Demons', '0-671-02735-2', 2000, 616, 1, 1);</span>
Kami mempunyai tiga kaedah utiliti: ProcessInput, ProcessOutput dan GetPDoinstance. Kami akan menggunakan dua yang pertama untuk memastikan kami mendapat input yang betul dan output yang betul. Yang ketiga akan menyediakan contoh PDO yang diperlukan.
Nota: Parameter kedua kaedah array_slice adalah "3" kerana persediaan projek khusus saya. Tukarnya apabila URL asas anda berubah.
Selepas itu, kami mengisytiharkan laluan kami menggunakan Objek $ Router, contoh kelas rutintroller. Kemudian, keajaiban berlaku dalam kaedah $ dispatcher-> Dispatch (), yang mengambil dua parameter: kaedah permintaan $ _server (get, post dan lain-lain) dan permintaan khusus URI. Dengan maklumat ini, penghantar memanggil laluan yang betul dan melaksanakan kod dalam penutupan. Nilai pulangan disimpan dalam pemboleh ubah tindak balas $, yang diberikan kepada kaedah prosesOtput () yang bergema sebagai rentetan JSON.
seperti yang anda lihat, dalam contoh khusus ini kami menyatakan satu laluan: Hello.
Nota: Jika anda mahu, bagaimanapun, anda boleh meningkatkan struktur sebenar. Buat fail baru dan panggilnya Routes.php. Kemudian, masukkannya dari fail index.php utama selepas permulaan objek $ Router: Anda akan mempunyai semua laluan anda dalam fail berasingan. Penyelesaian yang lebih elegan, pada pendapat saya.
yang mengatakan, anda sekarang tahu semua yang anda perlukan mengenai struktur asas contoh kami.
mari buat laluan pertama kami!
OK, mari kita lihat apa yang boleh kita lakukan dengan laluan dan berapa banyak kita boleh menyesuaikannya untuk keperluan kita.
kita bermula dengan perkara yang paling mudah: senarai penulis.
{ "require": { "phroute/phroute": "1.*" } }
Di baris pertama kami mengisytiharkan nama laluan kami, penulis.
mari kita menguji laluan: ini adalah hasilnya.
<span>CREATE TABLE IF NOT EXISTS authors (id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(250) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; </span> <span>INSERT INTO authors (id, name) </span> <span>VALUES </span> <span>(1, 'Dan Brown'), </span> <span>(2, 'Paulo Coelho'); </span> <span>CREATE TABLE IF NOT EXISTS categories (id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(250) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; </span> <span>INSERT INTO categories (id, name) </span> <span>VALUES </span> <span>(1, 'Thriller'), </span> <span>(2, 'Novel'); </span> <span>CREATE TABLE IF NOT EXISTS books (id int(10) unsigned NOT NULL AUTO_INCREMENT, title varchar(250) NOT NULL, isbn varchar(50) NOT NULL, year int(11) NOT NULL, pages int(11) NOT NULL, author_id int(10) unsigned NOT NULL, category_id int(10) unsigned NOT NULL, PRIMARY KEY (id), KEY author_id (author_id,category_id), KEY category_id (category_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7; </span> <span>INSERT INTO books (id, title, isbn, year, pages, author_id, category_id) </span> <span>VALUES </span> <span>(1, 'The Zahir', '0-06-083281-9', 2005, 336, 2, 2), </span> <span>(2, 'The Devil and Miss Prym', '0-00-711605-5', 2000, 205, 2, 2), </span> <span>(3, 'The Alchemist', '0-06-250217-4', 1988, 163, 2, 2), </span> <span>(4, 'Inferno', '978-0-385-53785-8', 2013, 480, 1, 1), </span> <span>(5, 'The Da Vinci Code', '0-385-50420-9', 2003, 454, 1, 1), </span> <span>(6, 'Angels & Demons', '0-671-02735-2', 2000, 616, 1, 1);</span>
Great!
Sekarang kita boleh membuat langkah ke hadapan: bagaimana dengan menambah parameter, untuk mendapatkan butiran penulis tunggal, memandangkan id?
sesuatu seperti itu:
<span><span><?php </span></span><span> </span><span> <span>require 'vendor/autoload.php'; </span></span><span> </span><span> <span>function processInput($uri){ </span></span><span> <span>$uri = implode('/', </span></span><span> <span>array_slice( </span></span><span> <span>explode('/', $_SERVER['REQUEST_URI']), 3)); </span></span><span> </span><span> <span>return $uri; </span></span><span> <span>} </span></span><span> </span><span> <span>function processOutput($response){ </span></span><span> <span>echo json_encode($response); </span></span><span> <span>} </span></span><span> </span><span> <span>function getPDOInstance(){ </span></span><span> <span>return new PDO('mysql:host=localhost;dbname=booksapi;charset=utf8', 'root', ''); </span></span><span> <span>} </span></span><span> </span><span> <span>$router = new Phroute<span>\RouteCollector</span>(new Phroute<span>\RouteParser</span>); </span></span><span> </span><span> <span>$router->get('hello', function(){ </span></span><span> <span>return 'Hello, PHRoute!'; </span></span><span> <span>}); </span></span><span> </span><span> <span>$dispatcher = new Phroute<span>\Dispatcher</span>(router); </span></span><span> </span><span> <span>try { </span></span><span> </span><span> <span>$response = $dispatcher->dispatch($_SERVER['REQUEST_METHOD'], processInput($_SERVER['REQUEST_URI'])); </span></span><span> </span><span> <span>} catch (Phroute<span>\Exception\HttpRouteNotFoundException</span> $e) { </span></span><span> </span><span> <span>var_dump($e); </span></span><span> <span>die(); </span></span><span> </span><span> <span>} catch (Phroute<span>\Exception\HttpMethodNotAllowedException</span> $e) { </span></span><span> </span><span> <span>var_dump($e); </span></span><span> <span>die(); </span></span><span> </span><span> <span>} </span></span><span> </span><span> <span>processOutput($response);</span></span>
anda boleh lulus parameter menggunakan pemegang tempat {variable_name}, dengan nama yang sama sebagai parameter untuk penutupan. Dalam contoh ini, kita mempunyai tempat letak {id} yang sepadan dengan parameter $ ID. Anda boleh menentukan mana -mana parameter yang anda mahukan: tiada had.
Kadang -kadang parameter boleh menjadi pilihan. Mari buat contoh lain: Jika kita menggunakan URL buku, kita ingin mengambil senarai semua buku pangkalan data. Tetapi, jika kita menentukan ID seperti Buku/1 kita akan mendapatkan senarai buku kategori yang diberikan.
di sini kita pergi:
<span>$router->get('authors', function(){ </span> <span>$db = getPDOInstance(); </span> <span>$sql = 'SELECT * FROM authors;'; </span> <span>$st = $db->prepare($sql, array(PDO<span>::</span>ATTR_CURSOR => PDO<span>::</span>CURSOR_FWDONLY)); </span> <span>$st->execute(); </span> <span>$result = $st->fetchAll(PDO<span>::</span>FETCH_CLASS); </span> <span>return $result; </span> <span>});</span>
Menambah "?" Selepas pemegang tempat parameter bermakna ia akan menjadi pilihan. Sudah tentu, adalah idea yang baik untuk menentukan nilai lalai dalam perisytiharan penutupan.
Sehingga kini kami membuat hanya mendapatkan laluan. Bagaimana dengan kata kerja HTTP yang lain?
tidak ada masalah. Lihatlah di sini:
[{"id":"1","name":"Dan Brown"},{"id":"2","name":"Paulo Coelho"}]
mari kita buat contoh laluan pos. Sudah tiba masanya untuk menambah buku baru ke koleksi kami!
<span>$router->get('author/{id}', function($id){ </span> <span>$db = getPDOInstance(); </span> <span>$sql = 'SELECT * FROM `authors` WHERE `id` = :id'; </span> <span>$st = $db->prepare($sql, array(PDO<span>::</span>ATTR_CURSOR => PDO<span>::</span>CURSOR_FWDONLY)); </span> <span>$st->execute(array(':id' => $id)); </span> <span>$result = $st->fetchAll(PDO<span>::</span>FETCH_CLASS); </span> <span>return $result; </span> <span>});</span>
Mari kita bayangkan bahawa kita mempunyai borang untuk mengisi data buku: atribut tindakannya akan menunjuk ke laluan buku yang kita buat sekarang!
Sekarang kita akan mengambil satu lagi langkah ke hadapan: sudah tiba masanya untuk "melindungi" laluan kita!
Sebenarnya, setiap orang yang memasuki laluan pos buku boleh memasukkan buku baru dalam koleksi kami. Itu sejuk, tetapi ini tidak seperti perkara yang biasanya berlaku. Bagaimana jika kita mahu melindungi laluan kita? Penapis adalah apa yang kita perlukan.
penapis sangat serupa dengan laluan: mereka mempunyai nama dan penutupan yang berkaitan, dilaksanakan apabila penapis dipanggil di suatu tempat.
Jadi, apakah perbezaannya? Penapis boleh dipanggil dengan mudah sebelum (atau selepas) laluan.
mari kita buat contoh:
{ "require": { "phroute/phroute": "1.*" } }
Pertama sekali, kami mengisytiharkan penapis dengan kaedah penapis () objek $ penghala. Sintaks adalah sama seperti dengan laluan. Kami memberikan nama dan penutupan yang akan dilaksanakan pada masa yang tepat.
ok, tapi apakah "masa yang tepat"?
Kami memutuskan sekarang: kami hanya menambah parameter ketiga ke kaedah pos (). Parameter ketiga ini adalah array, di mana kami menentukan kunci sebelum ini dengan nama penapis (logged_in). Dari saat ini, sebelum setiap panggilan ke laluan pos buku, penapis Logged_in (dan melaksanakan kandungan penutupannya) juga akan dipanggil.
Dalam kes khusus ini, kami menyemak pembolehubah user_id sesi untuk melihat sama ada pengguna log masuk.
Terdapat juga kunci selepas yang digunakan untuk menjalankan penapis tepat selepas panggilan laluan. Berikut adalah contoh.
<span>CREATE TABLE IF NOT EXISTS authors (id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(250) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; </span> <span>INSERT INTO authors (id, name) </span> <span>VALUES </span> <span>(1, 'Dan Brown'), </span> <span>(2, 'Paulo Coelho'); </span> <span>CREATE TABLE IF NOT EXISTS categories (id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(250) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3; </span> <span>INSERT INTO categories (id, name) </span> <span>VALUES </span> <span>(1, 'Thriller'), </span> <span>(2, 'Novel'); </span> <span>CREATE TABLE IF NOT EXISTS books (id int(10) unsigned NOT NULL AUTO_INCREMENT, title varchar(250) NOT NULL, isbn varchar(50) NOT NULL, year int(11) NOT NULL, pages int(11) NOT NULL, author_id int(10) unsigned NOT NULL, category_id int(10) unsigned NOT NULL, PRIMARY KEY (id), KEY author_id (author_id,category_id), KEY category_id (category_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7; </span> <span>INSERT INTO books (id, title, isbn, year, pages, author_id, category_id) </span> <span>VALUES </span> <span>(1, 'The Zahir', '0-06-083281-9', 2005, 336, 2, 2), </span> <span>(2, 'The Devil and Miss Prym', '0-00-711605-5', 2000, 205, 2, 2), </span> <span>(3, 'The Alchemist', '0-06-250217-4', 1988, 163, 2, 2), </span> <span>(4, 'Inferno', '978-0-385-53785-8', 2013, 480, 1, 1), </span> <span>(5, 'The Da Vinci Code', '0-385-50420-9', 2003, 454, 1, 1), </span> <span>(6, 'Angels & Demons', '0-671-02735-2', 2000, 616, 1, 1);</span>
Jika anda perlukan, anda juga boleh menentukan lebih daripada satu penapis pada masa yang sama.
Yang perlu anda lakukan ialah menggunakan pelbagai rentetan dan bukannya satu rentetan.
<span><span><?php </span></span><span> </span><span> <span>require 'vendor/autoload.php'; </span></span><span> </span><span> <span>function processInput($uri){ </span></span><span> <span>$uri = implode('/', </span></span><span> <span>array_slice( </span></span><span> <span>explode('/', $_SERVER['REQUEST_URI']), 3)); </span></span><span> </span><span> <span>return $uri; </span></span><span> <span>} </span></span><span> </span><span> <span>function processOutput($response){ </span></span><span> <span>echo json_encode($response); </span></span><span> <span>} </span></span><span> </span><span> <span>function getPDOInstance(){ </span></span><span> <span>return new PDO('mysql:host=localhost;dbname=booksapi;charset=utf8', 'root', ''); </span></span><span> <span>} </span></span><span> </span><span> <span>$router = new Phroute<span>\RouteCollector</span>(new Phroute<span>\RouteParser</span>); </span></span><span> </span><span> <span>$router->get('hello', function(){ </span></span><span> <span>return 'Hello, PHRoute!'; </span></span><span> <span>}); </span></span><span> </span><span> <span>$dispatcher = new Phroute<span>\Dispatcher</span>(router); </span></span><span> </span><span> <span>try { </span></span><span> </span><span> <span>$response = $dispatcher->dispatch($_SERVER['REQUEST_METHOD'], processInput($_SERVER['REQUEST_URI'])); </span></span><span> </span><span> <span>} catch (Phroute<span>\Exception\HttpRouteNotFoundException</span> $e) { </span></span><span> </span><span> <span>var_dump($e); </span></span><span> <span>die(); </span></span><span> </span><span> <span>} catch (Phroute<span>\Exception\HttpMethodNotAllowedException</span> $e) { </span></span><span> </span><span> <span>var_dump($e); </span></span><span> <span>die(); </span></span><span> </span><span> <span>} </span></span><span> </span><span> <span>processOutput($response);</span></span>
Bayangkan kes dunia sebenar: katakan kita mempunyai tiga laluan pos, satu untuk setiap entiti (pengarang, buku, kategori). Ia akan membosankan untuk menambah penapis logged_in tiga kali berbeza.
Jangan bimbang: Kumpulan penapis ada di sini untuk membantu.
<span>$router->get('authors', function(){ </span> <span>$db = getPDOInstance(); </span> <span>$sql = 'SELECT * FROM authors;'; </span> <span>$st = $db->prepare($sql, array(PDO<span>::</span>ATTR_CURSOR => PDO<span>::</span>CURSOR_FWDONLY)); </span> <span>$st->execute(); </span> <span>$result = $st->fetchAll(PDO<span>::</span>FETCH_CLASS); </span> <span>return $result; </span> <span>});</span>
Dengan kumpulan tunggal ini, kami menentukan penapis yang sama untuk tiga laluan yang berbeza.
Nota: Jika anda memerlukan, anda juga boleh bersarang kumpulan dalam kumpulan lain sebanyak yang anda suka.
Projek kami sedang membesar dan menganjurkan pangkalan kod kami dalam satu fail yang sangat berat, dan ceroboh. Bagaimana dengan menggunakan pengawal?
Ya: PHROUTE bukan hanya mengenai laluan. Apabila keadaan menjadi liar sudah tiba masanya untuk menyusunnya.
Pertama sekali, mari kita lihat bagaimana struktur pengawal seperti. Lihat contoh ini (kita boleh memasukkannya ke dalam fail Routes.php kami):
[{"id":"1","name":"Dan Brown"},{"id":"2","name":"Paulo Coelho"}]
Kami mencipta kelas pengarang. Dalam kelas ini kita meletakkan dua kaedah: getIndex () dan postadd ().
Kemudian, dengan kaedah pengawal () objek $ penghala, kami menghubungkan URL pengarang ke kelas pengarang. Oleh itu, jika kita memasuki pengarang URL dalam pelayar kami, kaedah getIndex () akan dipanggil secara automatik. Sama berlaku untuk kaedah postadd (), yang akan terikat kepada pengarang/tambah (pos) url.
ciri nama auto ini agak menarik, tetapi sebenarnya tidak mencukupi.
Bahagian pengawal berada pada peringkat awal pembangunan dan memerlukan banyak penambahbaikan. Salah satunya adalah kemungkinan untuk menentukan parameter untuk kaedah pengawal. Atau, mungkin, cara mudah untuk menentukan penapis untuk beberapa kaedah pengawal (dan bukan "semua atau tidak").
Terdapat banyak kerja yang perlu dilakukan, terutamanya di sebelah pengawal. Sebagai pemaju, saya fikir ia akan menjadi baik untuk mempunyai kelas pengawal asas generik untuk mengendalikan semua kerja kotor (dengan penapis, parameter kaedah dan sebagainya). Terdapat juga kekurangan dokumentasi.
Sebaliknya, PHROUTE datang dengan penghala yang sangat cepat. Pada halaman GitHub projek, anda dapat melihat beberapa statistik mengenai perbandingan dengan penghala teras Laravel: hasilnya menakjubkan. Dalam senario kes terburuk Phroute adalah kira -kira empat puluh (ya, 40) kali lebih cepat.
Jika anda ingin mengetahui butiran khusus mengenai "enjin" di belakang penghala ini, anda boleh melawat halaman Nikic di GitHub di mana dia menjelaskan setiap orang, dengan ujian, tanda aras dan hasil yang berkaitan.
adakah anda akan mencuba Phroute? Beritahu saya apa yang anda fikirkan!Soalan Lazim (Soalan Lazim) Mengenai Routing PHP Cepat dengan PHROUTE
$ router = new phrouterOuteCollector ();
});
Parameter laluan adalah bahagian URL yang boleh berbeza -beza. Dalam Phroute, anda boleh menentukan parameter laluan dengan memasukkannya dalam corak URL apabila menentukan laluan anda. Parameter laluan disertakan dalam pendakap keriting {}. Apabila laluan dipadankan, nilai parameter laluan disalurkan kepada fungsi atau kaedah pengendali sebagai argumen. Berikut adalah contoh:
$ router = new phrouterOuteCollector ();
$ router-> route ('get', '/users/{id}', function ($ id) {
kembali "ID Pengguna: $ id";
); PHROUTE adalah fungsi atau kaedah yang dijalankan sebelum atau selepas laluan dipadankan. Mereka boleh digunakan untuk melaksanakan tugas seperti pengesahan atau pengesahan input. Anda boleh menentukan penapis menggunakan kaedah penapis kelas PhouterOuteCollector, dan anda boleh menggunakannya ke laluan menggunakan kaedah sebelum dan selepas. Berikut adalah contoh:
}
});
$ router-> route ('get', '/dashboard', ['DashboardController', 'Show'])-> Sebelum ('auth');
Bagaimana saya mengendalikan 404 kesilapan dengan phroute? yang berlaku apabila tiada laluan sepadan dengan URL yang diminta. Anda boleh menentukan 404 pengendali menggunakan kaedah notfound kelas phrouterOuteCollector. Pengendali 404 adalah fungsi atau kaedah yang dipanggil apabila ralat 404 berlaku. Berikut adalah contoh:
$ router = new phrouterOuteCollector ();
$ router-> notFound (function () {
return '404 - Page tidak dijumpai';
Setelah anda menentukan laluan anda, anda boleh menghantarnya menggunakan Kelas PhouterOutedispatcher. Kaedah penghantaran kelas ini mengambil kaedah HTTP dan URL sebagai parameter, dan mengembalikan hasil fungsi atau kaedah pengendali laluan yang dipadankan. Berikut adalah contoh:
$ dispatcher = new PhrouperOuteDisPatcher ($ router-> getData ());
$ response = $ dispatcher-> Dispatch ($ _ server ['request_method'], $ _server ['request_uri [' ']); Rangka Kerja?
Ya, anda boleh menggunakan PHROUTE dengan kerangka PHP yang lain. PHROUTE adalah perpustakaan mandiri, yang bermaksud ia tidak bergantung kepada rangka kerja tertentu. Anda boleh menggunakannya dalam mana -mana aplikasi PHP, tanpa mengira rangka kerja yang anda gunakan. Walau bagaimanapun, anda mungkin perlu menyesuaikan kod anda untuk berfungsi dengan sistem penghalaan rangka kerja anda.
$ router = new phrouterOuteCollector ();
$ router-> route ('get', '/users/{id}', function ($ id) {
kembali "ID Pengguna: $ id";
Pengecualian dalam PHROUTE boleh dikendalikan dengan membungkus kod penghantaran anda dalam blok percubaan. Sekiranya pengecualian dilemparkan semasa proses penghantaran, anda boleh menangkapnya dan mengendalikannya dengan sewajarnya. Berikut adalah contoh:
cuba {
}
Atas ialah kandungan terperinci Routing PHP Cepat dengan PHROUTE. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!