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

PHP MVC 架構開發心得:從入口到路由的實作思考

     編輯:PHP 相關知識

前言

研究 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. 快取失效機制:資料更新時如何同步清除?

誠摯邀請前輩指點快取設計最佳實踐。

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