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

Corak Reka Bentuk PHP: Pengawal Hadapan

Barbara Streisand
Lepaskan: 2024-12-23 20:07:11
asal
658 orang telah melayarinya

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
Salin selepas log masuk

Autoload

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

{
    "autoload": {
        "psr-4": {
            "App\": "app/"
        }
    }
}
Salin selepas log masuk

Jalankan arahan berikut untuk menjana autoloader:

composer dump-autoload
Salin selepas log masuk

Ubah hala permintaan

apache(.htaccess)

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

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;
    }
}
Salin selepas log masuk

Selepas menyimpan fail konfigurasi, mulakan semula Nginx untuk menggunakan perubahan

sudo systemctl reload nginx
Salin selepas log masuk

Pengawal

Pengawal Rumah

namespace App\Controllers;

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

Pengawal Produk

namespace App\Controllers;

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

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;
    }
}
Salin selepas log masuk

Konfigurasi

laluan

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

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();
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan