Rumah > pembangunan bahagian belakang > tutorial php > Mencipta penghala halaman mudah dalam PHP

Mencipta penghala halaman mudah dalam PHP

DDD
Lepaskan: 2024-09-18 20:22:19
asal
474 orang telah melayarinya

Buat fail

Pertama, Kami akan mencipta fail index.php, router.php dan .htaccess.

Ubah hala semua permintaan ke index.php dalam .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
Salin selepas log masuk

Halang daripada capaian terus untuk router.php

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();
}
Salin selepas log masuk

Tambah kelas Halaman dalam router.php

class Page
{
  protected static bool $Return_404 = true;
}
Salin selepas log masuk

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);
    }
Salin selepas log masuk

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;
}
Salin selepas log masuk

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.

Tambah kelas Laluan dalam router.php

class Routes
{
    public static array $Route = array(
        "" => "Pages/home.php",
        "/about" => "Pages/about.php",
    );
}

Salin selepas log masuk

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.

Tambah kelas Router dalam router.php

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
{

}
Salin selepas log masuk

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();
    }
Salin selepas log masuk

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.

Fail router.php terakhir akan kelihatan seperti ini.

<?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",
    );
}

Salin selepas log masuk

Index.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>
Salin selepas log masuk

Semua kod HTML daripada halaman akan berada dalam teg "body".

Buat halaman

Akhir sekali, buat home.php, about.php dan 404.php dalam folder Pages.

home.php

<h1>Home page</h1>
Salin selepas log masuk

tentang.php

<h1>about page</h1>
Salin selepas log masuk

404.php

<h1>404 page</h1>
Salin selepas log masuk

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:

Creating a simple page router in PHP Tokigin / penghala halaman

Penghala manual dari repositori php-router

Atas ialah kandungan terperinci Mencipta penghala halaman mudah dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan