Rumah >pembangunan bahagian belakang >tutorial php >Corak Reka Bentuk PHP: Pengawal Hadapan

Corak Reka Bentuk PHP: Pengawal Hadapan

Barbara Streisand
Barbara Streisandasal
2024-12-23 20:07:11600semak imbas

PHP Design Patterns: Front Controller

Pengawal Depan ialah corak reka bentuk yang digunakan dalam pembangunan aplikasi web untuk memusatkan pengendalian permintaan. Daripada mempunyai berbilang titik masuk untuk bahagian sistem yang berlainan, semua permintaan dihalakan melalui pengawal pusat tunggal, bertanggungjawab untuk mengarahkannya ke komponen atau modul yang sesuai.

Bagaimana Ia Berfungsi

  1. Titik Kemasukan Tunggal: Semua permintaan HTTP diubah hala ke satu fail (biasanya index.php) menggunakan konfigurasi pelayan web (cth., .htaccess untuk Apache atau peraturan penghalaan dalam Nginx).
  2. Penghalaan: Pengawal Hadapan menganalisis URL dan menentukan bahagian kod yang harus dilaksanakan. Ini boleh dilaksanakan secara manual atau dengan penghalaan perpustakaan/rangka kerja.
  3. Delegasi: Berdasarkan laluan, Pengawal Hadapan mewakilkan permintaan kepada pengawal yang sesuai (kelas atau kaedah), yang memproses data dan mengembalikan respons.
  4. Respons: Pengawal menjana respons (biasanya HTML atau JSON) dihantar semula kepada penyemak imbas atau klien.

Kelebihan

  • Pemusatan: Semua aliran aplikasi masuk dikendalikan melalui satu titik, menjadikannya lebih mudah untuk mengurus dan menjejaki permintaan.
  • Fleksibiliti: Mengintegrasikan ciri global seperti pengesahan, kawalan kebenaran, pengelogan atau pengendalian ralat dengan mudah.
  • Kebolehgunaan semula: Logik biasa boleh dipusatkan dalam Pengawal Hadapan, mengurangkan pertindihan.
  • Kebolehselenggaraan: Pemusatan memudahkan kemas kini, seperti menambah laluan atau pengawal baharu.

Contoh

Struktur Direktori

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

Autoload

Untuk melaksanakan PSR-4, buat fail composer.json dalam akar projek:

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

Jalankan arahan berikut untuk menjana autoloader:

composer dump-autoload

Ubah hala permintaan

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

Selepas menyimpan fail konfigurasi, mulakan semula Nginx untuk menggunakan perubahan

sudo systemctl reload nginx

Pengawal

Pengawal Rumah

namespace App\Controllers;

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

Pengawal Produk

namespace App\Controllers;

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

teras

Titik Masuk

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

Konfigurasi

laluan

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

indeks (Pengawal Depan)

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

use App\Core\Entrypoint;

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

$entrypoint = new Entrypoint($routes);
$entrypoint->handleRequest();

Hasilnya

Pelaksanaan ini:

  • Memusatkan pengendalian permintaan menggunakan corak Pengawal Depan.
  • Merangkumi logik penghalaan dalam kelas Entrypoint.
  • Mengguna pakai PSR-4 untuk pemuatan auto dan organisasi kod yang lebih baik.
  • Menggunakan konfigurasi Nginx untuk persediaan yang lancar.

Atas ialah kandungan terperinci Corak Reka Bentuk PHP: Pengawal Hadapan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn