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
Barbara Streisandoriginal
2024-12-23 20:07:11602parcourir

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

Chargement automatique

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

{
    "autoload": {
        "psr-4": {
            "App\": "app/"
        }
    }
}

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

composer dump-autoload

Redirection des demandes

apache(.htaccess)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

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;
    }
}

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

sudo systemctl reload nginx

Contrôleurs

Contrôleur domestique

namespace App\Controllers;

class HomeController {
    public function index(): void {
        echo "Welcome to the home page!";
    }
}

Contrôleur de produit

namespace App\Controllers;

class ProductController
{
    public function list(): void
    {
        echo "Product list.";
    }
}

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;
    }
}

Configuration

itinéraires

$routes = [
    '/' => [
        'controller' => 'HomeController',
        'method' => 'index'
    ],
    '/products' => [
        'controller' => 'ProductController',
        'method' => 'list'
    ]
];

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();

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:
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