MVC(Model-View-Controller)架構模式在 PHP 框架中廣泛應用,但對於中小型專案或學習用途,完整框架往往過於沉重。本文將帶你從零實作一個極簡 MVC 架構,理解其核心運作機制,為後續學習主流框架打下堅實基礎。
MVC 將應用程式拆分為三個核心層次,各司其職:
主要優勢:關注點分離、程式碼結構清晰、易於維護擴展、便於團隊協作(前後端分離)。
採用單一入口檔 + 參數路由:
https://localhost/index.php?c=demo&a=index¶m=welcome
c:控制器名稱(對應 controller/{c}controller.php)a:動作方法名稱param:傳遞給動作的參數www/ # 站點根目錄
├── index.php # 統一入口檔
├── controller/ # 控制器目錄
│ └── democontroller.php
├── model/ # 模型目錄
│ └── model.php
└── view/ # 視圖目錄
└── index.php
controller/democontroller.php
<?php
class DemoController
{
public function index($param = '')
{
echo 'Hello World! 參數:' . $param;
}
}
?>
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);
?>
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);
}
}
?>
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¶m=welcome → 輸出:歡迎來到 MVC 世界https://localhost/index.php?c=demo&a=index¶m=title → 輸出:首頁標題https://localhost/index.php?c=demo&a=index¶m=about → 輸出:關於我們的內容此極簡實作已展示 MVC 核心運作,實際專案可延伸:
spl_autoload_register 或 Composer PSR-4通過不到 100 行核心代碼,我們實現了完整的 MVC 請求週期:入口檔路由 → 控制器協調 → 模型提供資料 → 視圖渲染輸出。這個極簡架構雖不具備生產級功能,但清晰展示了 MVC 的本質——職責分離與協作。理解這一核心後,再學習 Laravel、ThinkPHP、Yii 等主流框架將事半功倍。