> 백엔드 개발 > PHP 튜토리얼 > PHP 디자인 패턴: 전면 컨트롤러

PHP 디자인 패턴: 전면 컨트롤러

Barbara Streisand
풀어 주다: 2024-12-23 20:07:11
원래의
657명이 탐색했습니다.

PHP Design Patterns: Front Controller

Front Controller는 웹 애플리케이션 개발에서 요청 처리를 중앙 집중화하기 위해 사용되는 디자인 패턴입니다. 시스템의 다양한 부분에 대해 여러 진입점을 두는 대신 모든 요청은 단일 중앙 컨트롤러를 통해 라우팅되어 적절한 구성 요소나 모듈로 연결됩니다.

작동 방식

  1. 단일 진입점: 모든 HTTP 요청은 웹 서버 구성(예: Apache의 경우 .htaccess 또는 Nginx의 라우팅 규칙)을 사용하여 단일 파일(일반적으로 index.php)로 리디렉션됩니다.
  2. 라우팅: 프론트 컨트롤러는 URL을 분석하고 실행해야 할 코드 부분을 결정합니다. 이는 수동으로 구현하거나 라우팅 라이브러리/프레임워크를 사용하여 구현할 수 있습니다.
  3. 위임: 경로에 따라 프론트 컨트롤러는 요청을 적절한 컨트롤러(클래스 또는 메소드)에 위임하고, 컨트롤러는 데이터를 처리하고 응답을 반환합니다.
  4. 응답: 컨트롤러는 브라우저나 클라이언트로 다시 전송되는 응답(일반적으로 HTML 또는 JSON)을 생성합니다.

장점

  • 중앙 집중화: 모든 수신 애플리케이션 흐름이 단일 지점을 통해 처리되므로 요청을 더 쉽게 관리하고 추적할 수 있습니다.
  • 유연성: 인증, 권한 제어, 로깅 또는 오류 처리와 같은 전역 기능을 쉽게 통합합니다.
  • 재사용성: 공통 로직을 전면 컨트롤러에 집중화하여 중복을 줄일 수 있습니다.
  • 유지관리성: 중앙 집중화는 새로운 경로나 컨트롤러 추가와 같은 업데이트를 단순화합니다.

디렉토리 구조

/app
    /Controllers
        HomeController.php
        ProductController.php
    /Core
        Entrypoint.php
/config
    routes.php
/public
    index.php
/vendor
composer.json
로그인 후 복사

자동 로드

PSR-4를 구현하려면 프로젝트 루트에 작곡가.json 파일을 생성하세요.

{
    "autoload": {
        "psr-4": {
            "App\": "app/"
        }
    }
}
로그인 후 복사

자동 로더를 생성하려면 다음 명령을 실행하세요.

composer dump-autoload
로그인 후 복사

요청 리디렉션

아파치(.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();
로그인 후 복사

결과

이 구현:

  • Front Controller 패턴을 사용하여 요청 처리를 중앙 집중화합니다.
  • Entrypoint 클래스 내에 라우팅 논리를 캡슐화합니다.
  • 자동 로딩과 더 나은 코드 구성을 위해 PSR-4를 채택했습니다.
  • 원활한 설정을 위해 Nginx 구성을 사용합니다.

위 내용은 PHP 디자인 패턴: 전면 컨트롤러의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿