Der Front Controller ist ein Designmuster, das in der Webanwendungsentwicklung verwendet wird, um die Anfragebearbeitung zu zentralisieren. Anstatt mehrere Einstiegspunkte für verschiedene Teile des Systems zu haben, werden alle Anfragen über einen einzigen zentralen Controller weitergeleitet, der dafür verantwortlich ist, sie an die entsprechende Komponente oder das entsprechende Modul weiterzuleiten.
/app /Controllers HomeController.php ProductController.php /Core Entrypoint.php /config routes.php /public index.php /vendor composer.json
Um PSR-4 zu implementieren, erstellen Sie eine Composer.json-Datei im Projektstammverzeichnis:
{ "autoload": { "psr-4": { "App\": "app/" } } }
Führen Sie den folgenden Befehl aus, um den Autoloader zu generieren:
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; } }
Nach dem Speichern der Konfigurationsdatei starten Sie Nginx neu, um die Änderungen zu übernehmen
sudo systemctl reload nginx
HomeController
namespace App\Controllers; class HomeController { public function index(): void { echo "Welcome to the home page!"; } }
ProductController
namespace App\Controllers; class ProductController { public function list(): void { echo "Product list."; } }
Einstiegspunkt
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; } }
Routen
$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();
Diese Implementierung:
Das obige ist der detaillierte Inhalt vonPHP-Entwurfsmuster: Front-Controller. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!