摘要:這些所有的結構都只是該微型框架的一個基本結構,實際上復雜的框架會有很多擴展的函數以及外部插件,可以在這個目錄結構上做出相應調整。
一、框架整體分析
在實現一個框架之前,我們需要了解這個框架應該達到一個怎樣的效果,按照傳統框架的思路,大致可以總結出以下這么幾條:
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){ require_once("/libs/Controller/".$name."Controller.class.php"); eval("$obj=new ".$name."Controller();$obj->".$method."();"); } function M($name){ require_once("/libs/Model/".$name."Model.class.php"); eval("$obj=new ".$name."Model();"); return $obj; } function V($name){ require_once("/libs/View/".$name."View.class.php"); eval("$obj=new ".$name."View();"); return $obj; }
(2)原生方法改造
熟悉smarty的朋友都應該知道,smarty有assign和dispaly兩個方法,分別用于注冊變量和將變量輸出到模版文件,但如果同時注冊多個變量會讓我們的代碼變得很冗雜,所以我們嘗試對這兩個方法進行改造
public static function assign($data){ foreach ($data as $key => $value) { self::$view->assign($key,$value); } } public static function display($template){ self::$view->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) { include_once($currentdir."/".$path); } /** * 完成一系列的初始化和調用控制器 */ class PC { public static $controller; public static $method; private static $config; private static function init_db(){ DB::init("mysql",self::$config["dbconfig"]); } private static function init_view(){ VIEW::init("Smarty",self::$config["viewconfig"]); } private static function init_controller(){ self::$controller=isset($_GET["controller"])?daddslashes($_GET["controller"]):"index"; } private static function init_method(){ self::$method=isset($_GET["method"])?daddslashes($_GET["method"]):"index"; } public static function run($config){ self::$config = $config; self::init_db(); self::init_view(); self::init_controller(); self::init_method(); C(self::$controller,self::$method); } }
foreach遍歷包含include.list.php中的所有文件,并將控制器和對應方法獲取傳遞給C類進行自動包含。再看一下include.list.php有哪些東西
$paths=$arrayName = array( "function/function.php", "libs/core/DB.class.php", "libs/core/VIEW.class.php", "db/mysql.class.php", "view/Smarty/Smarty.class.php" );
這里面存儲了一個數組,包含了咱們的兩個工廠類、數據庫操作類、外部引擎類、核心function類。
至此,可以梳理一下整個框架對一個url請求的處理流程:
(4)業務分離
mvc的核心就在于各層之間的嚴格分離,但Controller層和Model經常容易被混淆在一起,這樣會導致mvc架構失去原有的意義,我們需要清楚,控制層只實現簡單的控制和邏輯處理,不涉及到具體的業務和數據交互,所有的具體操作都應放到Model層。另外,這兩層中的類名和文件名也應保持一致。
(5)方法控制
我們在通過url的形式調用控制器及方法時,某些方法是不想被外部調用到的,比如登錄檢查函數,這個時候我們可以通過將函數定義為私有函數的方式避免其直接被通過url的形式調用到,來防止風險的發生。
(6)擴展性設計
一個框架應該具備好的擴展性,尤其對于新外部庫引入,應該能很容易通過簡單修改就可以使用,因此應該將配置項多帶帶分離存儲。
三、總結
該框架基本設計就是這個樣子,很簡單,但基本實現了mvc架構,雖然和市面上的成熟框架相差很多,但重寫一遍對于mvc的架構理解會更加深入,加之如今越來越多的網站都采用的這種單入口mvc架構,對于這類網站的滲透更需要很好的理解。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22304.html
摘要:一個微型的實現的庫體積很小帶詳盡的注釋總共只有行支持鏈式調用支持關系前言最開始接觸是在學習的時候,那個時候覺得用操作數據庫真的是太方便了。但是已經算是一個小型的庫了。同樣的還提供了簡寫的以及,等接口函數。 一個微型的PHP實現的AR庫 體積很小帶詳盡的注釋總共只有400行支持鏈式調用支持關系 前言 最開始接觸ActiveRecord是在學習Yii的時候,那個時候覺得用AR操作數據庫真的...
摘要:每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷安全和有效。官方網站是一款老牌的框架,現在穩定版本已經是了。官方網站是由最大的社區之一的管理開發的,也是一個開源的框架。 對于Web開發者來說,PHP是一款非常強大而又受歡迎的編程語言。世界上很多頂級的網站都是基于PHP開發的。 每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷、安全和有效。在開發項目之前選...
摘要:語言行為及特征狀態看不懂任何英語技術,英語文檔,凡事沒有培訓部在搞的,只有英文文檔的東西國內一律沒大公司在用,都非主流,排斥英文文檔和新技術,以及各種超出他學習能力范圍的技術。 在撰寫此文前首先必須申明的是本人不鄙視任何一種框架,也無意于挑起PHP框架間的戰爭,更沒有貶低某個框架使用者的用意,本文純粹個人的看法。你可以認為我無知也好,或者裝逼也好,請不要試著在任何情況下,隨便發起言語的...
摘要:所以,是幫助您創建您的項目的測試框架,單元測試。行為驅動開發是一個來自測試驅動開發的開發過程。這種語言被稱為,是用來描述被測試的預期的行為。代碼將被測試并且沒有異常。這些標準提出了現代編碼風格。 本文來自medium----原文鏈接; 歡迎作客我們的php&Laravel學習群:109256050 你需要開始使用測試 這是我每天對自己說的話。像很多人一樣,我不會像TDD所建議的那樣測試...
閱讀 2985·2021-11-24 10:22
閱讀 3050·2021-11-23 10:10
閱讀 1359·2021-09-28 09:35
閱讀 1756·2019-08-29 13:16
閱讀 1397·2019-08-26 13:29
閱讀 2792·2019-08-26 10:27
閱讀 683·2019-08-26 10:09
閱讀 1443·2019-08-23 18:05