首頁 > 後端開發 > php教程 > 用 PHP 建立一個簡單的頁面路由器

用 PHP 建立一個簡單的頁面路由器

DDD
發布: 2024-09-18 20:22:19
原創
473 人瀏覽過

建立文件

首先,我們將建立index.php、router.php 和.htaccess 檔案。

將所有請求重定向到.htaccess 中的index.php

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
登入後複製

防止直接存取router.php

如果使用者直接輸入存取router.php的url,此程式碼將顯示404回應。

<?php
if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) {
    http_response_code(404);
    die();
}
登入後複製

在router.php中加入Page類

class Page
{
  protected static bool $Return_404 = true;
}
登入後複製

建立一個靜態布林變數用於傳回 404 頁面。我們將其預設為 true。
現在我們為404頁面新增一個功能。

protected static function Return_404(): void
    {
       (file_exists("./Pages/404.php")) ?  require_once "./Pages/404.php" : http_response_code(404);
    }
登入後複製

在這裡,我將 404 頁面放入 Pages 資料夾中。您可以將其放入任何您想要的資料夾中。

我們也會新增「檔案」功能。

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;
}
登入後複製

此函數將檢查請求網址是否包含查詢字串或以“/”結尾並將其刪除。
我使用“strok”字串函數來獲取“?”之前的字串值。我知道「strok」不應該這樣使用,但它確實有效,可以讓我免於不必要地執行複雜的演算法。我使用“rtrim”字串函數來刪除“/”(如果它包含在字串的最後)。

在router.php中加入Routes類

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

登入後複製

在這裡,我建立了一個靜態陣列來儲存路由。
該陣列包含“Requested url”=> “檔案位置”。
我把所有頁面文件放在Pages資料夾中。你可以把它們放在任何你想要的地方。

在router.php中加入Router類

Router 類別將從我們上面建立的 Page 類別擴展。
注意“”=>; “Pages/home.php”,用於主頁。

class Router extends Page
{

}
登入後複製

現在,我們將編寫檢查請求的檔案是否存在於 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();
    }
登入後複製

函數首先檢查請求的檔案是否在 $Route 陣列中。如果存在,則將靜態布林值 $Return_404 設為 false,以便 404 頁面不會顯示並取得頁面檔案。如果不存在,將返回 404 頁面。
如果存在但Pages資料夾中沒有文件,則函數將回顯「錯誤」。您可以在此處顯示 404 頁面而不是 echo“Error”。

最終的 router.php 檔案將如下所示。

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

登入後複製

索引.php

在index.php中,我們將使用Router類別中的「Run」函數。

<!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>
登入後複製

頁面中的所有 HTML 程式碼都將位於「body」標籤中。

建立頁面

最後,在Pages資料夾中建立home.php、about.php和404.php。

home.php

<h1>Home page</h1>
登入後複製

about.php

<h1>about page</h1>
登入後複製

404.php

<h1>404 page</h1>
登入後複製

檢查程式碼是否與「xampp」或「PHP server」擴充功能一起工作。

如果您遇到錯誤,請隨時告訴我。 XD

您也可以在以下位置檢查 github 儲存庫:

Creating a simple page router in PHP 時銀 / 頁面路由器

來自 php-router 儲存庫的手動路由器

以上是用 PHP 建立一個簡單的頁面路由器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板