Pertama, Kami akan mencipta fail index.php, router.php dan .htaccess.
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L,QSA]
Kod ini akan menunjukkan respons 404 jika pengguna memasukkan url untuk mengakses router.php secara terus.
<?php if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) { http_response_code(404); die(); }
class Page { protected static bool $Return_404 = true; }
Buat pembolehubah boolean statik untuk mengembalikan halaman 404. Kami akan menetapkannya kepada benar sebagai lalai.
Kini kami menambah fungsi untuk halaman 404.
protected static function Return_404(): void { (file_exists("./Pages/404.php")) ? require_once "./Pages/404.php" : http_response_code(404); }
Di sini, saya meletakkan halaman 404 di dalam folder Halaman. Anda boleh meletakkannya dalam mana-mana folder yang anda mahukan.
Kami juga akan menambah fungsi "Fail".
protected static function File(string $file): string { if (!empty($file)) { (str_contains($file, "?")) ? $file = strtok($file, '?') : $file; ($file[strlen($file) - 1] === "/") ? $file = rtrim($file, "/") : $file; } return $file; }
Fungsi ini akan menyemak sama ada url permintaan mengandungi rentetan pertanyaan atau berakhir dengan "/" dan mengalih keluarnya.
Saya menggunakan fungsi rentetan "strok" untuk mendapatkan nilai rentetan sebelum "?". Saya tahu "strok" tidak dimaksudkan untuk digunakan seperti ini tetapi ia berfungsi dan menyelamatkan saya daripada melakukan algoritma kompleks secara tidak perlu. Saya menggunakan fungsi rentetan "rtrim" untuk mengeluarkan "/" jika ia terkandung pada rentetan terakhir.
class Routes { public static array $Route = array( "" => "Pages/home.php", "/about" => "Pages/about.php", ); }
Di sini, saya mencipta tatasusunan statik untuk menyimpan penghalaan.
Tatasusunan ini mengandungi "url yang diminta" => "Lokasi fail".
Saya meletakkan semua fail halaman dalam folder Halaman. Anda boleh meletakkannya di mana sahaja anda mahu.
Kelas Penghala akan dilanjutkan daripada kelas Halaman yang telah kami buat di atas.
Ambil perhatian bahawa "" => "Pages/home.php", adalah untuk halaman utama.
class Router extends Page { }
Sekarang, kami akan menulis fungsi yang menyemak sama ada fail yang diminta wujud dalam kelas Router.
public static function Run(): void { $requested_file = self::File($_SERVER["REQUEST_URI"]); foreach (Routes::$Route as $request => $file) { if ($requested_file === $request) { if (file_exists($file)) { self::$Return_404 = false; require $file; } else echo "Error"; } } if (self::$Return_404) self::Return_404(); }
Fungsi ini menyemak fail yang diminta berada dalam tatasusunan $Route terlebih dahulu. Jika ia wujud, boolean statik $Return_404 ditetapkan kepada palsu supaya halaman 404 tidak akan dipaparkan dan mendapatkan fail halaman. Jika tidak wujud, ini akan mengembalikan halaman 404.
Jika ia wujud tetapi tiada fail dalam folder Halaman, fungsi tersebut akan menggemakan "Ralat". Anda boleh menunjukkan halaman 404 dan bukannya menggemakan "Ralat" di sini.
<?php if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) { http_response_code(404); die(); } class Page { protected static bool $Return_404 = true; protected static function Return_404(): void { (file_exists("./Pages/404.php")) ? require_once "./Pages/404.php" : http_response_code(404); } protected static function File(string $file): string { if (!empty($file)) { (str_contains($file, "?")) ? $file = strtok($file, '?') : $file; ($file[strlen($file) - 1] === "/") ? $file = rtrim($file, "/") : $file; } return $file; } } class Router extends Page { public static function Run(): void { $requested_file = self::File($_SERVER["REQUEST_URI"]); foreach (Routes::$Route as $request => $file) { if ($requested_file === $request) { if (file_exists($file)) { self::$Return_404 = false; require $file; } else echo "Error"; } } if (self::$Return_404) self::Return_404(); } } class Routes { public static array $Route = array( "" => "Pages/home.php", "/about" => "Pages/about.php", ); }
Dalam index.php, kami akan menggunakan fungsi "Run" daripada kelas Router.
<!DOCTYPE html> <html lang="en"> <?php require_once "./router.php"; ?> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Router</title> </head> <body> <?php Router::Run(); ?> </body> </html>
Semua kod HTML daripada halaman akan berada dalam teg "body".
Akhir sekali, buat home.php, about.php dan 404.php dalam folder Pages.
home.php
<h1>Home page</h1>
tentang.php
<h1>about page</h1>
404.php
<h1>404 page</h1>
Semak sama ada kod berfungsi atau tidak dengan sambungan "xampp" atau "pelayan PHP".
Jika anda menghadapi ralat, sila beritahu saya. XD
Anda juga boleh menyemak repositori github di:
Atas ialah kandungan terperinci Mencipta penghala halaman mudah dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!