PHP で単純なページルーターを作成する

DDD
リリース: 2024-09-18 20:22:19
オリジナル
457 人が閲覧しました

ファイルの作成

まず、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);
    }
ログイン後にコピー

ここでは、Pages フォルダー内に 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;
}
ログイン後にコピー

この関数は、リクエスト URL にクエリ文字列または「/」で終わるクエリ文字列が含まれているかどうかを確認し、それを削除します。
「strok」文字列関数を使用して、「?」より前の文字列値を取得します。 「strok」がこのように使用されることを意図していないことはわかっていますが、これは機能し、複雑なアルゴリズムを不必要に実行する必要がなくなります。 「rtrim」文字列関数を使用して、文字列の最後に「/」が含まれている場合はそれを削除します。

router.php に Routes クラスを追加します

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

ログイン後にコピー

ここでは、ルーティングを保存するための静的配列を作成します。
この配列には「リクエストされた 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 ページを表示できます。

最終的な 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」タグ内にあります。

ページの作成

最後に、home.php、about.php、404.php を Pages フォルダーに作成します。

home.php

<h1>Home page</h1>
ログイン後にコピー

about.php

<h1>about page</h1>
ログイン後にコピー

404.php

<h1>404 page</h1>
ログイン後にコピー

「xampp」または「PHP サーバー」拡張機能でコードが動作するかどうかを確認します。

エラーが発生した場合は、お気軽にお知らせください。 XD

次の場所で Github リポジトリを確認することもできます。

Creating a simple page router in PHP ときぎん / ページルーター

php-router リポジトリからの手動ルーター

以上がPHP で単純なページルーターを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート