ホームページ >バックエンド開発 >PHPチュートリアル >PHP デザイン パターン: フロント コントローラー

PHP デザイン パターン: フロント コントローラー

Barbara Streisand
Barbara Streisandオリジナル
2024-12-23 20:07:11699ブラウズ

PHP Design Patterns: Front Controller

フロント コントローラーは、Web アプリケーション開発でリクエスト処理を一元化するために使用される設計パターンです。システムのさまざまな部分に複数のエントリ ポイントを持つ代わりに、すべてのリクエストは単一の中央コントローラーを介してルーティングされ、適切なコンポーネントまたはモジュールにリクエストを送信します。

仕組み

  1. 単一のエントリ ポイント: すべての HTTP リクエストは、Web サーバー設定 (Apache の .htaccess や Nginx のルーティング ルールなど) を使用して単一のファイル (通常はindex.php) にリダイレクトされます。
  2. ルーティング: フロント コントローラーは URL を分析し、コードのどの部分を実行するかを決定します。これは手動で、またはルーティング ライブラリ/フレームワークを使用して実装できます。
  3. 委任: ルートに基づいて、フロント コントローラーはリクエストを適切なコントローラー (クラスまたはメソッド) に委任し、コントローラーはデータを処理して応答を返します。
  4. レスポンス: コントローラーは、ブラウザーまたはクライアントに送り返されるレスポンス (通常は HTML または JSON) を生成します。

利点

  • 一元化: すべての受信アプリケーション フローは 1 つのポイントを通じて処理されるため、リクエストの管理と追跡が容易になります。
  • 柔軟性: 認証、権限制御、ロギング、エラー処理などのグローバル機能を簡単に統合します。
  • 再利用性: 共通ロジックをフロント コントローラーに集中させて重複を減らすことができます。
  • 保守性: 一元化により、新しいルートやコントローラーの追加などの更新が簡素化されます。

ディレクトリ構造

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

オートロード

PSR-4 を実装するには、プロジェクト ルートにcomposer.json ファイルを作成します。

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

次のコマンドを実行してオートローダーを生成します:

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

構成ファイルを保存した後、Nginx を再起動して変更を適用します

sudo systemctl reload nginx

コントローラー

ホームコントローラー

namespace App\Controllers;

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

プロダクトコントローラー

namespace App\Controllers;

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

コア

エントリーポイント

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

構成

ルート

$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();

結果

この実装:

  • フロント コントローラー パターンを使用してリクエスト処理を一元化します。
  • Entrypoint クラス内のルーティング ロジックをカプセル化します。
  • 自動ロードとコード構成の改善のために PSR-4 を採用します。
  • シームレスなセットアップのために Nginx 構成を使用します。

以上がPHP デザイン パターン: フロント コントローラーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。