研究 MVC 架構近一個月,參考社群前輩指導,建構出一套自有 MVC 流程與框架雛形,但靈活度與快取機制仍待改進。本文分享目前架構設計,期望拋磚引玉,獲得高手指點。
採多入口檔案模式,內容統一載入核心引擎:
<?php require 'command/config.php'; require 'command/app.php'; app::run($config); ?>
public function run($config) {
header("Content-type:text/html;charset=utf-8");
self::$config = $config;
self::copyright();
self::testsystem(); // 系統環境檢測
self::setsystem(); // 系統參數設定
self::incinfo(); // 載入網站資訊
if(!IN_WEB) exit('網站維護中...');
defined('KEHENG_DEBUG') or define('KEHENG_DEBUG', true);
self::setpath(); // 系統路徑設定
self::getdatabase(); // 資料庫連線測試
self::loadlib(); // 載入核心類庫
self::getRouteConfig(); // 路由解析與控制器載入
}
支援多種 URL 模式(url_type 設定),解析控制器名稱,載入對應模型與視圖:
public function getRouteConfig() {
$route_type = self::$config['route']['url_type'];
switch($route_type) {
case 1: $urlstr = $_GET['controller']; break;
case 4: $urlstr = strtolower(substr(end(explode('/', $_SERVER["PHP_SELF"])), 0, -4)); break;
}
if(file_exists(Contr_DIR . 'Controller.php')) {
require Contr_DIR . 'Controller.php';
$template = self::$config['Templates'];
controller::load($urlstr, $template);
} else exit('控制器不存在');
}
控制器根據路由載入模型與模板,資料輸出透過 views 類封裝:
class controller {
public function load($url, $template) {
if(file_exists(Model_DIR . $url . '.model.php')) {
$views = new views;
require Model_DIR . $url . '.model.php';
$temp = $config[$url][0];
if($temp && file_exists(Templ_DIR . $temp)) {
require Templ_DIR . $temp;
} else exit('視圖檔案不存在');
unset($views);
} else exit('模型檔案不存在');
}
}
目前架構缺乏快取層。思考方向:
1. 讀取資料前優先檢查快取
2. 快取不存在或過期才查詢資料庫並建立快取
3. 快取儲存策略:檔案快取?Redis?APCu?
4. 快取失效機制:資料更新時如何同步清除?
誠摯邀請前輩指點快取設計最佳實踐。