Heim > Backend-Entwicklung > PHP-Tutorial > PHP-Entwurfsmuster: Front-Controller

PHP-Entwurfsmuster: Front-Controller

Barbara Streisand
Freigeben: 2024-12-23 20:07:11
Original
660 Leute haben es durchsucht

PHP Design Patterns: Front Controller

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.

Wie es funktioniert

  1. Einzelner Einstiegspunkt: Alle HTTP-Anfragen werden mithilfe der Webserverkonfiguration (z. B. .htaccess für Apache oder Routing-Regeln in Nginx) in eine einzelne Datei (normalerweise index.php) umgeleitet.
  2. Routing: Der Front Controller analysiert die URL und bestimmt, welcher Teil des Codes ausgeführt werden soll. Dies kann manuell oder mit Routing-Bibliotheken/Frameworks implementiert werden.
  3. Delegation: Basierend auf der Route delegiert der Front Controller die Anfrage an den entsprechenden Controller (Klasse oder Methode), der die Daten verarbeitet und eine Antwort zurückgibt.
  4. Antwort: Der Controller generiert eine Antwort (normalerweise HTML oder JSON), die an den Browser oder Client zurückgesendet wird.

Vorteile

  • Zentralisierung: Alle eingehenden Bewerbungsflüsse werden über einen einzigen Punkt abgewickelt, was die Verwaltung und Nachverfolgung von Anfragen erleichtert.
  • Flexibilität: Integriert problemlos globale Funktionen wie Authentifizierung, Berechtigungskontrolle, Protokollierung oder Fehlerbehandlung.
  • Wiederverwendbarkeit: Gemeinsame Logik kann im Front Controller zentralisiert werden, wodurch Duplikate reduziert werden.
  • Wartbarkeit: Die Zentralisierung vereinfacht Aktualisierungen, z. B. das Hinzufügen neuer Routen oder Controller.

Beispiel

Verzeichnisstruktur

/app
    /Controllers
        HomeController.php
        ProductController.php
    /Core
        Entrypoint.php
/config
    routes.php
/public
    index.php
/vendor
composer.json
Nach dem Login kopieren

Automatisches Laden

Um PSR-4 zu implementieren, erstellen Sie eine Composer.json-Datei im Projektstammverzeichnis:

{
    "autoload": {
        "psr-4": {
            "App\": "app/"
        }
    }
}
Nach dem Login kopieren

Führen Sie den folgenden Befehl aus, um den Autoloader zu generieren:

composer dump-autoload
Nach dem Login kopieren

Anfragen umleiten

Apache(.htaccess)

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

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 Login kopieren

Nach dem Speichern der Konfigurationsdatei starten Sie Nginx neu, um die Änderungen zu übernehmen

sudo systemctl reload nginx
Nach dem Login kopieren

Controller

HomeController

namespace App\Controllers;

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

ProductController

namespace App\Controllers;

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

Kern

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;
    }
}
Nach dem Login kopieren

Konfig

Routen

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

Index (Front-Controller)

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

use App\Core\Entrypoint;

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

$entrypoint = new Entrypoint($routes);
$entrypoint->handleRequest();
Nach dem Login kopieren

Ergebnis

Diese Implementierung:

  • Zentralisiert die Anfragebearbeitung mithilfe des Musters Front Controller.
  • Kapselt Routing-Logik innerhalb der Entrypoint-Klasse.
  • Übernimmt PSR-4 für automatisches Laden und bessere Codeorganisation.
  • Verwendet die Nginx-Konfiguration für eine nahtlose Einrichtung.

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage