Maison > développement back-end > tutoriel php > Modèles de conception PHP : contrôleur frontal

Modèles de conception PHP : contrôleur frontal

Barbara Streisand
Libérer: 2024-12-23 20:07:11
original
698 Les gens l'ont consulté

PHP Design Patterns: Front Controller

Le Front Controller est un modèle de conception utilisé dans le développement d'applications Web pour centraliser le traitement des requêtes. Au lieu d'avoir plusieurs points d'entrée pour différentes parties du système, toutes les demandes sont acheminées via un seul contrôleur central, chargé de les diriger vers le composant ou le module approprié.

Comment ça marche

  1. Point d'entrée unique : Toutes les requêtes HTTP sont redirigées vers un seul fichier (généralement index.php) à l'aide de la configuration du serveur Web (par exemple, .htaccess pour Apache ou des règles de routage dans Nginx).
  2. Routage : Le Front Controller analyse l'URL et détermine quelle partie du code doit s'exécuter. Cela peut être implémenté manuellement ou avec des bibliothèques/frameworks de routage.
  3. Délégation : En fonction de l'itinéraire, le Front Controller délègue la demande au contrôleur approprié (classe ou méthode), qui traite les données et renvoie une réponse.
  4. Réponse : Le contrôleur génère une réponse (généralement HTML ou JSON) renvoyée au navigateur ou au client.

Avantages

  • Centralisation : Tous les flux de candidatures entrantes sont gérés via un point unique, ce qui facilite la gestion et le suivi des demandes.
  • Flexibilité :Intègre facilement des fonctionnalités globales telles que l'authentification, le contrôle des autorisations, la journalisation ou la gestion des erreurs.
  • Réutilisabilité : La logique commune peut être centralisée dans le contrôleur frontal, réduisant ainsi la duplication.
  • Maintenabilité : La centralisation simplifie les mises à jour, telles que l'ajout de nouveaux itinéraires ou de nouveaux contrôleurs.

Exemple

Structure du répertoire

/app
    /Controllers
        HomeController.php
        ProductController.php
    /Core
        Entrypoint.php
/config
    routes.php
/public
    index.php
/vendor
composer.json
Copier après la connexion

Chargement automatique

Pour implémenter PSR-4, créez un fichier composer.json à la racine du projet :

{
    "autoload": {
        "psr-4": {
            "App\": "app/"
        }
    }
}
Copier après la connexion

Exécutez la commande suivante pour générer l'autoloader :

composer dump-autoload
Copier après la connexion

Redirection des demandes

apache(.htaccess)

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

nginx

server {
    listen 80;
    server_name example.com;

    root /path/to/your/project/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; # Adjust for your PHP version
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~* \.(css|js|jpg|jpeg|png|gif|ico|woff|woff2|ttf|svg|eot|ttc|otf|webp|avif)$ {
        expires max;
        log_not_found off;
    }

    location ~ /\.ht {
        deny all;
    }
}
Copier après la connexion

Après avoir enregistré le fichier de configuration, redémarrez Nginx pour appliquer les modifications

sudo systemctl reload nginx
Copier après la connexion

Contrôleurs

Contrôleur domestique

namespace App\Controllers;

class HomeController {
    public function index(): void {
        echo "Welcome to the home page!";
    }
}
Copier après la connexion

Contrôleur de produit

namespace App\Controllers;

class ProductController
{
    public function list(): void
    {
        echo "Product list.";
    }
}
Copier après la connexion

Cœur

Point d'entrée

namespace App\Core;

class Entrypoint {

    public function __construct(private array $routes) {
    }

    public function handleRequest(): void {
        $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

        if (isset($this->routes[$uri])) {
            $route = $this->routes[$uri];
            $controller = new $route['controller'];
            $method = $route['method'];

            if (method_exists($controller, $method)) {
                $controller->$method();
            } else {
                $this->sendResponse(500, "Method not found.");
            }
        } else {
            $this->sendResponse(404, "Page not found.");
        }
    }

    private function sendResponse(int $statusCode, string $message): void {
        http_response_code($statusCode);
        echo $message;
    }
}
Copier après la connexion

Configuration

itinéraires

$routes = [
    '/' => [
        'controller' => 'HomeController',
        'method' => 'index'
    ],
    '/products' => [
        'controller' => 'ProductController',
        'method' => 'list'
    ]
];
Copier après la connexion

index (contrôleur frontal)

require_once __DIR__ . '/../vendor/autoload.php';

use App\Core\Entrypoint;

$routes = require __DIR__ . '/../config/routes.php';

$entrypoint = new Entrypoint($routes);
$entrypoint->handleRequest();
Copier après la connexion

Résultat

Cette implémentation :

  • Centralise le traitement des requêtes à l'aide du modèle Front Controller.
  • Encapsule la logique de routage dans la classe Entrypoint.
  • Adopte PSR-4 pour le chargement automatique et une meilleure organisation du code.
  • Utilise la configuration Nginx pour une configuration transparente.

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal