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

PHP 輕量級 MVC 實作教學:從零構建核心架構

     編輯:PHP 相關知識

PHP 輕量級 MVC 實作教學:從零構建核心架構

MVC(Model-View-Controller)架構模式在 PHP 框架中廣泛應用,但對於中小型專案或學習用途,完整框架往往過於沉重。本文將帶你從零實作一個極簡 MVC 架構,理解其核心運作機制,為後續學習主流框架打下堅實基礎。

什麼是 MVC?

MVC 將應用程式拆分為三個核心層次,各司其職:

  • Model(模型):處理資料邏輯、資料庫操作、業務規則
  • View(視圖):負責輸出呈現、模板渲染、前端資源管理
  • Controller(控制器):接收請求、協調 Model 與 View、決定回應邏輯

主要優勢:關注點分離、程式碼結構清晰、易於維護擴展、便於團隊協作(前後端分離)。

URL 路由約定

採用單一入口檔 + 參數路由:

https://localhost/index.php?c=demo&a=index&param=welcome
  • c:控制器名稱(對應 controller/{c}controller.php)
  • a:動作方法名稱
  • param:傳遞給動作的參數

目錄結構規劃

www/                    # 站點根目錄
├── index.php           # 統一入口檔
├── controller/         # 控制器目錄
│   └── democontroller.php
├── model/              # 模型目錄
│   └── model.php
└── view/               # 視圖目錄
    └── index.php

逐步實作核心元件

1. 控制器基礎類

controller/democontroller.php

<?php
class DemoController
{
    public function index($param = '')
    {
        echo 'Hello World! 參數:' . $param;
    }
}
?>

2. 入口檔:路由分發核心

index.php

<?php
// 獲取路由參數
$c_str = isset($_GET['c']) ? $_GET['c'] : 'demo';      // 預設控制器
$method = isset($_GET['a']) ? $_GET['a'] : 'index';    // 預設動作
$param  = isset($_GET['param']) ? $_GET['param'] : ''; // 額外參數

// 構建控制器類別名與檔案路徑
$className = ucfirst($c_str) . 'Controller';           // DemoController
$filePath  = __DIR__ . "/controller/{$className}.php";

// 載入控制器檔案
if (!file_exists($filePath)) {
    die("控制器不存在:{$className}");
}
require_once $filePath;

// 實例化並呼叫動作
$controller = new $className();
if (!method_exists($controller, $method)) {
    die("動作方法不存在:{$method}");
}
$controller->$method($param);
?>

3. 視圖層:分離輸出邏輯

view/index.php

<?php
class View
{
    public function display($data)
    {
        // 可在此處加入模板引擎渲染邏輯
        // 簡單示範直接輸出
        echo $data;
    }
}
?>

修改控制器使用視圖:

<?php
// controller/democontroller.php
class DemoController
{
    private $data = 'Hello from View!';

    public function index($param = '')
    {
        require_once __DIR__ . '/../view/index.php';
        $view = new View();
        $view->display($this->data . ' 參數:' . $param);
    }
}
?>

4. 模型層:封裝資料存取

model/model.php

<?php
class Model
{
    private $data = [
        'title'   => '首頁標題',
        'welcome' => '歡迎來到 MVC 世界',
        'about'   => '關於我們的內容'
    ];

    public function getData($key)
    {
        return $this->data[$key] ?? '資料不存在';
    }
}
?>

入口檔傳遞參數給控制器動作:

<?php
// index.php (修改後)
$param = isset($_GET['param']) ? $_GET['param'] : 'welcome';
// ... 載入控制器 ...
$controller->$method($param); // 將參數傳給動作方法
?>

控制器協調 Model 與 View:

<?php
// controller/democontroller.php (完整版)
class DemoController
{
    public function index($param = 'welcome')
    {
        require_once __DIR__ . '/../view/index.php';
        require_once __DIR__ . '/../model/model.php';

        $model = new Model();
        $view  = new View();

        $data = $model->getData($param);
        $view->display($data);
    }
}
?>

驗證成果

訪問以下 URL 觀察輸出:

  • https://localhost/index.php?c=demo&a=index&param=welcome → 輸出:歡迎來到 MVC 世界
  • https://localhost/index.php?c=demo&a=index&param=title → 輸出:首頁標題
  • https://localhost/index.php?c=demo&a=index&param=about → 輸出:關於我們的內容

架構優化方向

此極簡實作已展示 MVC 核心運作,實際專案可延伸:

  • 自動載入機制:使用 spl_autoload_register 或 Composer PSR-4
  • 基礎控制器類:封裝通用方法(載入模型、視圖、重導向、輸入過濾)
  • 路由系統:支援 RESTful 風格、參數綁定、中介軟體
  • 模板引擎整合:Blade、Twig、Smarty 等
  • 資料庫抽象層:PDO 封裝、Query Builder、ORM
  • 異常處理與日誌:統一錯誤頁面、除錯模式
  • 安全防護:CSRF Token、XSS 過濾、SQL 注入防護

總結

通過不到 100 行核心代碼,我們實現了完整的 MVC 請求週期:入口檔路由 → 控制器協調 → 模型提供資料 → 視圖渲染輸出。這個極簡架構雖不具備生產級功能,但清晰展示了 MVC 的本質——職責分離與協作。理解這一核心後,再學習 Laravel、ThinkPHP、Yii 等主流框架將事半功倍。

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