首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 輕量級 MVC 標準規範設計:零侵入、零配置、約定優於配置的實踐思路

     編輯:PHP 相關知識

面對 Laravel、Symfony、ThinkPHP 等成熟框架,**重複造輪子毫無意義**。但理解 MVC 核心契約、依賴注入、約定優於配置 (CoC) 等設計原理,能讓你更深層次地駕馭現有框架、進行架構決策、甚至在微服務/Serverless 場景下構建極簡應用層。本文提出一套**教學/參考級**的輕量級 MVC 標準規範。

設計目標

  • 無侵入:業務代碼**零依賴**框架基類/介面,純 POPO (Plain Old PHP Object)。
  • 零配置/零註解:完全靠目錄結構與命名約定自動發現。
  • 極簡介面:僅定義 `setter` 注入、`getter` 輸出、動作方法、跳轉返回值四大契約。
  • 可遷移:業務邏輯與框架解耦,框架更換時業務代碼**零修改**。

核心契約定義 (介面規範)

1. Controller 契約

<?php
// 無需實現任何介面,僅遵循以下約定

class ArticleController
{
    // 1. 請求參數自動注入 (setter 注入,支援層級屬性 book.title)
    public function setTitle(string $title) { $this->title = $title; }
    public function setBook(Book $book) { $this->book = $book; } // 嵌套對象自動構建

    // 2. 視圖數據輸出 (getter 供 View 讀取 ${property})
    public function getTitle(): string { return $this->title; }
    public function getArticles(): array { return $this->articles; }

    // 3. Session 參數同樣走 setter 注入 (loginUserId 等),請求參數同名會被 Session 覆蓋
    public function setLoginUserId(int $id) { $this->loginUserId = $id; }

    // 4. 動作方法:任意非 setter/getter 的 public 方法
    public function listAction(): ?string {
        $this->articles = ArticleModel::all();
        return null; // null 表示渲染默認 View (list)
    }

    public function saveAction(): string {
        // 處理邏輯...
        return 'list'; // 返回字串 -> 跳轉至另一 Controller (listAction)
        // 不允許一個 Controller 對應多個 View
    }

    // 5. Model 依賴同樣走 setter 自動裝配
    public function setArticleModel(ArticleModel $model) { $this->articleModel = $model; }
}
?>

2. Model 契約

  • 純領域對象/資料映射類,無基類要求。
  • 依賴關係 (Model 之間、Controller→Model) 統一由容器通過 `setter` 自動裝配。
  • 單例模式加載 (狀態無關/共享連接)。

3. View 契約

  • **一對一映射**:`Module/Controller/Action` → `view/module/controller/action.{php|tpl|html}`。
  • 支援多模板引擎擴展 (PHP 原生、Twig、Blade、Smarty...)。
  • View 中直接讀取 Controller `getter` 暴露的屬性:`$this->title`、 `$this->articles`。
  • 無 Controller 時 View 仍可執行 (隱式 Controller),適合靜態頁/片段。

URL 訪問規範

https://host[:port][/app]/module/controller/action.html[?params]
// 例:/admin/article/list.html?page=2&status=published
// 映射:AdminModule -> ArticleController -> listAction
// View:view/admin/article/list.php

副檔名 `.html` 偽靜態,路由層解析去除。

約定優於配置 (CoC) 自動發現規則

類型命名空間/目錄約定實例化策略
Model`App\Module\*Model` 或 `app/module/*/model/`單例
Controller`App\Module\*Controller` 或 `app/module/*/controller/`原型 (每請求新建)
View`views/module/controller/action.ext`按需渲染

框架啟動時掃描符合約定的類,建立映射表,請求到來時實例化 Controller、注入依賴、執行動作、渲染 View。

極簡框架核心實現骨架 (參考)

<?php
// 入口文件 public/index.php
require __DIR__ . '/../vendor/autoload.php';

$app = new MicroMvc\App([
    'module_paths' => [__DIR__ . '/../app'],
    'view_paths'   => [__DIR__ . '/../views'],
    'template_engine' => 'php', // 或 twig, blade
]);

$app->run();

// 核心類 MicroMvc\App (極簡版)
namespace MicroMvc;

class App {
    public function run() {
        $route = $this->parseRoute($_SERVER['REQUEST_URI']); // 解析 module/controller/action
        $controller = $this->instantiateController($route);
        $this->injectDependencies($controller); // setter 注入請求參數、Session、Model
        $viewName = $controller->{$route['action'] . 'Action'}(); // 執行動作
        $this->renderView($controller, $viewName ?? $route['action']);
    }

    private function injectDependencies($controller) {
        $ref = new ReflectionClass($controller);
        foreach ($ref->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
            $name = $method->getName();
            if (str_starts_with($name, 'set')) {
                $paramName = lcfirst(substr($name, 3)); // setTitle -> title
                $value = $this->resolveValue($paramName, $method->getParameters()[0] ?? null);
                if ($value !== null) $method->invoke($controller, $value);
            }
        }
    }
    // ... resolveValue 從 $_GET/$_POST/$_SESSION/容器 解析
    // ... renderView 定位模板、extract(getters)、include
}
?>

優勢總結

  1. 業務純淨:Controller/Model 無 `extends BaseController`、`use Trait`、註解,單元測試極簡 (直接 new、set、call)。
  2. 框架可換:從 MicroMvc 遷移到 Laravel 只需調整路由註冊、DI 綁定、View 路徑,**業務邏輯不動一行代碼**。
  3. 學習價值:看透 IOC、AOP、CoC、前端控制器、模板渲染等核心機制本質。

現實落地建議

「理想很豐滿,現實很骨感。」生產環境**強烈建議直接使用成熟框架** (Laravel/Symfony/Webman/Hyperf)。本規範的價值在於:

  • 面試/架構評審時展現「懂框架本質」
  • 微服務 Sidecar、Serverless Function、CLI 工具等**極簡場景**自建輕量層
  • 老專案重構時,作為「目標架構藍圖」指導分層解耦

理解標準,不是為了造輪子,而是為了**不被輪子綁架**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved