Maison > développement back-end > tutoriel php > Création d'un simple routeur de pages en PHP

Création d'un simple routeur de pages en PHP

DDD
Libérer: 2024-09-18 20:22:19
original
478 Les gens l'ont consulté

Créer des fichiers

Tout d'abord, nous allons créer les fichiers index.php, router.php et .htaccess.

Rediriger toutes les requêtes vers index.php dans .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
Copier après la connexion

Empêcher l'accès direct pour router.php

Ce code affichera une réponse 404 si l'utilisateur saisit l'URL pour accéder directement à router.php.

<?php
if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) {
    http_response_code(404);
    die();
}
Copier après la connexion

Ajouter une classe Page dans router.php

class Page
{
  protected static bool $Return_404 = true;
}
Copier après la connexion

Créez une variable booléenne statique pour renvoyer la page 404. Nous le définirons sur true par défaut.
Nous ajoutons maintenant une fonction pour la page 404.

protected static function Return_404(): void
    {
       (file_exists("./Pages/404.php")) ?  require_once "./Pages/404.php" : http_response_code(404);
    }
Copier après la connexion

Ici, j'ai mis une page 404 dans le dossier Pages. Vous pouvez le mettre dans n'importe quel dossier de votre choix.

Nous ajouterons également la fonction "Fichier".

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;
}
Copier après la connexion

Cette fonction vérifiera si l'URL de la requête contient une chaîne de requête ou se termine par "/" et la supprimera.
J'utilise la fonction de chaîne "strok" pour obtenir les valeurs de chaîne avant "?". Je sais que "strok" n'est pas destiné à être utilisé comme ça, mais cela fonctionne et m'évite de faire inutilement des algorithmes complexes. J'utilise la fonction de chaîne "rtrim" pour supprimer le "/" s'il est contenu à la fin de la chaîne.

Ajouter la classe Routes dans router.php

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

Copier après la connexion

Ici, je crée un tableau statique pour stocker les routages.
Ce tableau contient "URL demandée" => "Emplacement du fichier".
J'ai mis tous les fichiers de page dans le dossier Pages. Vous pouvez les placer où vous voulez.

Ajouter une classe de routeur dans router.php

La classe Router s'étendra de la classe Page que nous avons déjà créée ci-dessus.
Notez que "" => "Pages/home.php", est pour la page d'accueil.

class Router extends Page
{

}
Copier après la connexion

Maintenant, nous allons écrire la fonction qui vérifie si le fichier demandé existe dans la classe 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();
    }
Copier après la connexion

Cette fonction vérifie d'abord que le fichier demandé se trouve dans le tableau $Route. S'il existe, le booléen statique $Return_404 est défini sur false afin que la page 404 ne s'affiche pas et n'obtienne pas le fichier d'échange. S'il n'existe pas, cela renverra la page 404.
S'il existe mais qu'il n'y a aucun fichier dans le dossier Pages, la fonction fera écho à "Erreur". Vous pouvez afficher la page 404 au lieu de faire écho "Erreur" ici.

Le fichier router.php final ressemblera à ceci.

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

Copier après la connexion

Index.php

Dans le index.php, nous utiliserons la fonction "Run" de la classe 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>
Copier après la connexion

Tout le code HTML des pages sera dans la balise "body".

Créer des pages

Enfin, créez home.php, about.php et 404.php dans le dossier Pages.

home.php

<h1>Home page</h1>
Copier après la connexion

à propos.php

<h1>about page</h1>
Copier après la connexion

404.php

<h1>404 page</h1>
Copier après la connexion

Vérifiez si le code fonctionne ou non avec l'extension "xampp" ou "Serveur PHP".

Si vous rencontrez une erreur, n'hésitez pas à me le dire. XD

Vous pouvez également consulter le référentiel github à l'adresse :

Creating a simple page router in PHP Tokigin / routeur de pages

Routeur manuel à partir du référentiel php-router

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal