Maison >développement back-end >tutoriel php >Modèles de conception PHP : contrôleur frontal
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é.
/app /Controllers HomeController.php ProductController.php /Core Entrypoint.php /config routes.php /public index.php /vendor composer.json
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
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ô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."; } }
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; } }
itinéraires
$routes = [ '/' => [ 'controller' => 'HomeController', 'method' => 'index' ], '/products' => [ 'controller' => 'ProductController', 'method' => 'list' ] ];
require_once __DIR__ . '/../vendor/autoload.php'; use App\Core\Entrypoint; $routes = require __DIR__ . '/../config/routes.php'; $entrypoint = new Entrypoint($routes); $entrypoint->handleRequest();
Cette implémentation :
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!