這六個概念構成現代 PHP 應用架構的骨架。本文不僅定義術語,更剖析它們的關係、演進脈絡與落地選型建議,幫助開發者建立正確的架構心智模型。
應用程式所有 HTTP 請求均導向單一 PHP 檔案 (通常為 public/index.php),由該檔案啟動框架、路由分發、執行控制器、回應。
server {
root /var/www/app/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
index.php、靜態資源,原始碼、配置、Vendor 置於 Web Root 外。「單一入口會造成效能瓶頸?」
錯誤。PHP-FPM 池化處理並發,入口檔案僅初始化框架核心 (毫秒級),真正耗時在業務邏輯、DB、外部 API。反而因集中初始化可共用快取、連線池,提升整體吞吐。
| 層 | 職責 | 不應包含 |
|---|---|---|
| Model | 資料存取、業務規則、領域邏輯 | HTTP 請求/回應、模板渲染 |
| View | 資料呈現 (HTML, JSON, XML, CSV) | 資料庫查詢、複雜業務計算 |
| Controller | 接收請求、協調 Model/View、回應 | SQL、HTML 字串拼接、複雜業務邏輯 |
sequenceDiagram
Client->>Front Controller: HTTP Request
Front Controller->>Router: Match Route
Router->>Controller: Dispatch
Controller->>Model: Call Business Logic
Model-->>Controller: Return Domain Object/DTO
Controller->>View: Pass Data
View-->>Controller: Rendered Response
Controller-->>Client: HTTP Response
MVC 在 Web 端常退化為「胖 Controller」。ADR 更精準對應 HTTP 語意:
extends 復用與擴充,PHP 單一繼承 + Trait 組合。| 原則 | PHP 實踐 | ||
|---|---|---|---|
| SRP | 一個類別只有一個變更理由 (Service、Repository、Entity 分離) | ||
| OCP | 擴充用介面/抽象類別,修改關閉 (Strategy Pattern、Middleware) | ||
| LSP | 子類別可替換父類別 (嚴格型別提示、契約測試) | ||
| ISP | 介面細粒度 (LoggerInterface, CacheableInterface 而非 God Interface) | ||
| DIP | 依賴抽象而非具體 (Constructor Injection、Container) |
| ORM | 模式 | 特色 | 適用場景 |
|---|---|---|---|
| Doctrine | Data Mapper | 功能最完整、DQL、事件系統、遷移工具 | 大型企業應用、複雜領域模型 |
| Eloquent (Laravel) | Active Record | 語法優雅、關聯易用、生態豐富 | 中小型專案、快速開發 |
| Cycle ORM | Data Mapper | 無註解、嚴格型別、效能導向 | 現代 PHP 8.1+、高效能需求 |
| Atlas.Orm | Data Mapper | 嚴格分離持久化與領域、不可變實體 | DDD 專案 |
| 優點 | 缺點 |
|---|---|
| 極簡單、直觀、開發速度快 | 實體耦合持久化、難以單元測試 |
| 程式碼生成器友善 | 跨表/複雜查詢易產生胖模型 |
| 適合 CRUD 為主的應用 | 不適合豐富領域模型 (DDD) |
Laravel Eloquent 支援 Custom Queries、Scopes、Accessors/Mutators、Casts,可在 ActiveRecord 基礎上引入部分 Data Mapper 特性。嚴格 DDD 專案建議改用 Doctrine/Cycle ORM。
graph TD
A[單一入口] --> B[路由分發]
B --> C[Controller/Action]
C --> D[Service/Domain Layer]
D --> E[Repository (CRUD)]
E --> F[ORM (Data Mapper / ActiveRecord)]
F --> G[(資料庫)]
C --> H[Responder/View]
H --> I[HTTP Response]
style A fill:#e1f5fe
style F fill:#fff3e0
| 專案類型 | 架構風格 | ORM 選擇 | 備註 |
|---|---|---|---|
| CMS、電商、後台管理 | MVC / ADR | Eloquent / Cycle | CRUD 為主,開發效率優先 |
| 金融核心、ERP、複雜業務 | DDD + Layered | Doctrine / Cycle | Data Mapper、嚴格型別、可測試 |
| 微服務、API Gateway | ADR / Clean Architecture | Cycle / Atlas | 無框架耦合、效能敏感 |
| 高併發、即時系統 | CQRS / Event Sourcing | 自定 Repository + PDO | 讀寫分離、事件溯源 |
單一入口是基礎設施,MVC/ADR 是表現層協議,OOP 是設計語言,ORM 是資料存取抽象,CRUD 是操作原語,ActiveRecord 是 ORM 的一種實現模式。理解它們的定位與邊界,才能在專案初期做出正確架構決策,避免過度設計或架構債務累積。