一、框架整體分析
在實現乙個框架之前,我們需要了解這個框架應該達到乙個怎樣的效果,按照傳統框架的思路,大致可以總結出以下這麼幾條:
1.實現mvc架構,將控制、邏輯、檢視層進行分離。
2.封裝各種函式及功能模組,實現一處編寫,多處呼叫,減少**冗餘。
3.便於擴充套件,可方便的引入外部擴充套件庫,對自身框架進行增強。
4.選好設計模式,封裝或編寫各種引擎模組。
基本的框架需求大概就是這個樣子,有了這些需求,接下來就是乙個架構的設計,這裡面涉及到的很多問題需要解決,下面我們一步步進行乙個剖析。
二、框架設計過程
1.框架目錄
這其實是個很重要的步驟,你的選擇不同,最後目錄結構也會有很大區別,除了滿足基本的三層之外,擴充套件庫,前端檔案,模版,資源檔案等也需要找目錄放置,而這又決定了之後你的呼叫是否方便,我此次框架設計使用了smaty引擎作為檢視引擎,目錄結構大概如下:
這張圖展示出了兩級目錄的乙個結構,更深入的目錄由於顯示有限就不一一弄出來了,而每個目錄及主要檔案的作用會在後文一一說到。
2.目錄介紹
(1)data目錄
可以看到上圖中的目錄結構,由於使用了smarty引擎,而在smarty引擎中需要配置緩衝目錄和快取目錄,因此data目錄的作用就在於此。
(2)framework目錄
該目錄是我們框架的核心所在,db目錄放置了我們的資料庫操作函式庫。function目錄放置了乙個function.php的檔案,該檔案的作用主要為方便以m(『do』)這樣的模式對各層方法的呼叫進行快速例項化。libs目錄放置了框架的核心工廠類檔案,如資料庫的操作類,檢視操作類,方便外部檔案以如db::funtion()這樣的方式對這裡面的方法進行呼叫。view放置了smarty檢視引擎。include.list.php則是我們框架在呼叫時需要包含的檔案,這裡通通放在乙個陣列裡進行儲存。pc.php是我們的框架啟動引擎,負責對我們的各個模組進行統一初始化,以及對我們的url進行解析處理。
(3)img目錄
用於放置我們的樣式檔案、js檔案以及其他相關的資源檔案
(4)libs目錄
該目錄和framework下的libs目錄名字雖然一樣,但可以看到,該目錄下放置的是mvc三層中的對應業務處理內容以及乙個org擴充套件目錄,controller放置控制器、model放置模型、view放置檢視處理類。
(5)tpl目錄
這個目錄則放置一些模板檔案,用於前端展示,可以看到我放置了admin和index兩個目錄,分別用於前台和後台的模板檔案存放。
(6)admin.php和index.php
一般來說,採用mvc架構都會使用單入口模式,而這兩個檔案就是單入口模式的入口檔案,用以啟動該框架。
(7)config.php
這個基本所有的框架都有,配置檔案,包含了比如資料庫的配置,smarty引擎的配置,及一些靜態變數的定義等。
這些所有的結構都只是該微型框架的乙個基本結構,實際上覆雜的框架會有很多擴充套件的函式以及外部外掛程式,可以在這個目錄結構上做出相應調整。
3.框架關鍵點
(1)控制器動態呼叫
單入口模式通常的url大概類似 index.php?controller=控制器&method=方法,在通過get方法獲取到控制器和方法名之後,我們可以通過如下方式進行動態初始化
function c($name,$method)
function m($name)
function v($name)
(2)原生方法改造
熟悉smarty的朋友都應該知道,smarty有assign和dispaly兩個方法,分別用於註冊變數和將變數輸出到模版檔案,但如果同時註冊多個變數會讓我們的**變得很冗雜,所以我們嘗試對這兩個方法進行改造
public static function assign($data)
}public static function display($template)
我們讓assign方法重寫,讓其可以直接註冊陣列,這樣就減少了我們的後續**量,如果要引入其它外部庫,也可以通過這種方法對原生函式進行改造來使其更加適用。
(3)檔案包含邏輯
本框架的啟動檔案為pc.php,因此,包含了pc.php就基本上包含了整個框架所需要用到的檔案,先看一下乙個入口檔案index.php的內容。
header("content-type:text/html;charset=utf-8");
date_default_timezone_set('asia/shanghai');
require_once('config.php');
require_once('framework/pc.php');
pc::run($config)
很簡單,包含了配置檔案和框架啟動引擎pc.php,然後呼叫run方法啟動該框架就可以,再看看pc.php的內容
$currentdir=dirname(__file__);
include_once($currentdir.'/include.list.php');
foreach ($paths as $path)
/*** 完成一系列的初始化和呼叫控制器
*/class pc
private static function init_view()
private static function init_controller()
private static function init_method()
public static function run($config)
}
foreach遍歷包含include.list.php中的所有檔案,並將控制器和對應方法獲取傳遞給c類進行自動包含。再看一下include.list.php有哪些東西
);這裡面儲存了乙個陣列,包含了咱們的兩個工廠類、資料庫操作類、外部引擎類、核心function類。
至此,可以梳理一下整個框架對乙個url請求的處理流程:
(4)業務分離
mvc的核心就在於各層之間的嚴格分離,但controller層和model經常容易被混淆在一起,這樣會導致mvc架構失去原有的意義,我們需要清楚,控制層只實現簡單的控制和邏輯處理,不涉及到具體的業務和資料互動,所有的具體操作都應放到model層。另外,這兩層中的類名和檔名也應保持一致。
(5)方法控制
我們在通過url的形式呼叫控制器及方法時,某些方法是不想被外部呼叫到的,比如登入檢查函式,這個時候我們可以通過將函式定義為私有函式的方式避免其直接被通過url的形式呼叫到,來防止風險的發生。
(6)擴充套件性設計
乙個框架應該具備好的擴充套件性,尤其對於新外部庫引入,應該能很容易通過簡單修改就可以使用,因此應該將配置項單獨分離儲存。
三、總結
該框架基本設計就是這個樣子,很簡單,但基本實現了mvc架構,雖然和市面上的成熟框架相差很多,但重寫一遍對於mvc的架構理解會更加深入,加之如今越來越多的**都採用的這種單入口mvc架構,對於這類**的滲透更需要很好的理解。
MegEngine 框架設計
megengine框架設計 megengine 技術負責人許欣然將帶了解乙個深度學習框架是如何把網路的定義逐步優化並最終執行的,從框架開發者的視角來看待深度學習。背景 ai 浪潮一波又一波,彷彿不會演算法就落後於時代。深度學習框架處理了各種裝置的計算細節 求導 計算優化序列的工作,而在動態 靜態兩套...
測試框架設計
關於測試框架的好處,比如快速回歸提高測試效率,提高測試覆蓋率等這裡就不討論了。這裡主要討論自動化框架包含哪些內容,以及如何去設計乙個測試框架。1.什麼是自動化測試框架?它是由乙個或多個自動化測試基礎模組 自動化測試管理模組 自動化測試統計模組等組成的工具集合。以常見的前端ui測試為例,乙個測試框架大...
WCC框架設計
乙個好的框架,不僅能幫助程式開發節約很多時間,同時也能減少bug的引入。這個框架是在ssy同學的基礎上進行了一些改進 主要在於一下幾點 會隨著專案開發逐漸更新這篇文章 1.應用了反射機制,實現網路task的多型。2.應用mvc模式,獨立出資料model,讓activity更加專注在介面響應和基本的業...