摘要:這些所有的結(jié)構(gòu)都只是該微型框架的一個(gè)基本結(jié)構(gòu),實(shí)際上復(fù)雜的框架會(huì)有很多擴(kuò)展的函數(shù)以及外部插件,可以在這個(gè)目錄結(jié)構(gòu)上做出相應(yīng)調(diào)整。
一、框架整體分析
在實(shí)現(xiàn)一個(gè)框架之前,我們需要了解這個(gè)框架應(yīng)該達(dá)到一個(gè)怎樣的效果,按照傳統(tǒng)框架的思路,大致可以總結(jié)出以下這么幾條:
1.實(shí)現(xiàn)MVC架構(gòu),將控制、邏輯、視圖層進(jìn)行分離。
2.封裝各種函數(shù)及功能模塊,實(shí)現(xiàn)一處編寫,多處調(diào)用,減少代碼冗余。
3.便于擴(kuò)展,可方便的引入外部擴(kuò)展庫(kù),對(duì)自身框架進(jìn)行增強(qiáng)。
4.選好設(shè)計(jì)模式,封裝或編寫各種引擎模塊。
基本的框架需求大概就是這個(gè)樣子,有了這些需求,接下來(lái)就是一個(gè)架構(gòu)的設(shè)計(jì),這里面涉及到的很多問(wèn)題需要解決,下面我們一步步進(jìn)行一個(gè)剖析。
二、框架設(shè)計(jì)過(guò)程
1.框架目錄
這其實(shí)是個(gè)很重要的步驟,你的選擇不同,最后目錄結(jié)構(gòu)也會(huì)有很大區(qū)別,除了滿足基本的三層之外,擴(kuò)展庫(kù),前端文件,模版,資源文件等也需要找目錄放置,而這又決定了之后你的調(diào)用是否方便,我此次框架設(shè)計(jì)使用了smaty引擎作為視圖引擎,目錄結(jié)構(gòu)大概如下:
這張圖展示出了兩級(jí)目錄的一個(gè)結(jié)構(gòu),更深入的目錄由于圖片顯示有限就不一一弄出來(lái)了,而每個(gè)目錄及主要文件的作用會(huì)在后文一一說(shuō)到。
2.目錄介紹
(1)data目錄
可以看到上圖中的目錄結(jié)構(gòu),由于使用了smarty引擎,而在smarty引擎中需要配置緩沖目錄和緩存目錄,因此data目錄的作用就在于此。
(2)framework目錄
該目錄是我們框架的核心所在,db目錄放置了我們的數(shù)據(jù)庫(kù)操作函數(shù)庫(kù)。function目錄放置了一個(gè)function.php的文件,該文件的作用主要為方便以M(‘do’)這樣的模式對(duì)各層方法的調(diào)用進(jìn)行快速實(shí)例化。libs目錄放置了框架的核心工廠類文件,如數(shù)據(jù)庫(kù)的操作類,視圖操作類,方便外部文件以如DB::funtion()這樣的方式對(duì)這里面的方法進(jìn)行調(diào)用。view放置了smarty視圖引擎。include.list.php則是我們框架在調(diào)用時(shí)需要包含的文件,這里通通放在一個(gè)數(shù)組里進(jìn)行保存。pc.php是我們的框架啟動(dòng)引擎,負(fù)責(zé)對(duì)我們的各個(gè)模塊進(jìn)行統(tǒng)一初始化,以及對(duì)我們的url進(jìn)行解析處理。
(3)img目錄
用于放置我們的樣式文件、js文件以及其他相關(guān)的資源文件
(4)libs目錄
該目錄和framework下的libs目錄名字雖然一樣,但可以看到,該目錄下放置的是MVC三層中的對(duì)應(yīng)業(yè)務(wù)處理內(nèi)容以及一個(gè)org擴(kuò)展目錄,Controller放置控制器、Model放置模型、View放置視圖處理類。
(5)tpl目錄
這個(gè)目錄則放置一些模板文件,用于前端展示,可以看到我放置了admin和index兩個(gè)目錄,分別用于前臺(tái)和后臺(tái)的模板文件存放。
(6)admin.php和index.php
一般來(lái)說(shuō),采用mvc架構(gòu)都會(huì)使用單入口模式,而這兩個(gè)文件就是單入口模式的入口文件,用以啟動(dòng)該框架。
(7)config.php
這個(gè)基本所有的框架都有,配置文件,包含了比如數(shù)據(jù)庫(kù)的配置,smarty引擎的配置,及一些靜態(tài)變量的定義等。
這些所有的結(jié)構(gòu)都只是該微型框架的一個(gè)基本結(jié)構(gòu),實(shí)際上復(fù)雜的框架會(huì)有很多擴(kuò)展的函數(shù)以及外部插件,可以在這個(gè)目錄結(jié)構(gòu)上做出相應(yīng)調(diào)整。
3.框架關(guān)鍵點(diǎn)
(1)控制器動(dòng)態(tài)調(diào)用
單入口模式通常的url大概類似 index.php?controller=控制器&method=方法,在通過(guò)get方法獲取到控制器和方法名之后,我們可以通過(guò)如下方式進(jìn)行動(dòng)態(tài)初始化
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的朋友都應(yīng)該知道,smarty有assign和dispaly兩個(gè)方法,分別用于注冊(cè)變量和將變量輸出到模版文件,但如果同時(shí)注冊(cè)多個(gè)變量會(huì)讓我們的代碼變得很冗雜,所以我們嘗試對(duì)這兩個(gè)方法進(jìn)行改造
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方法重寫,讓其可以直接注冊(cè)數(shù)組,這樣就減少了我們的后續(xù)代碼量,如果要引入其它外部庫(kù),也可以通過(guò)這種方法對(duì)原生函數(shù)進(jìn)行改造來(lái)使其更加適用。
(3)文件包含邏輯
本框架的啟動(dòng)文件為pc.php,因此,包含了pc.php就基本上包含了整個(gè)框架所需要用到的文件,先看一下一個(gè)入口文件index.php的內(nèi)容。
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)
很簡(jiǎn)單,包含了配置文件和框架啟動(dòng)引擎pc.php,然后調(diào)用run方法啟動(dòng)該框架就可以,再看看pc.php的內(nèi)容
$currentdir=dirname(__FILE__); include_once($currentdir."/include.list.php"); foreach ($paths as $path) { include_once($currentdir."/".$path); } /** * 完成一系列的初始化和調(diào)用控制器 */ 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中的所有文件,并將控制器和對(duì)應(yīng)方法獲取傳遞給C類進(jìn)行自動(dòng)包含。再看一下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" );
這里面存儲(chǔ)了一個(gè)數(shù)組,包含了咱們的兩個(gè)工廠類、數(shù)據(jù)庫(kù)操作類、外部引擎類、核心function類。
至此,可以梳理一下整個(gè)框架對(duì)一個(gè)url請(qǐng)求的處理流程:
(4)業(yè)務(wù)分離
mvc的核心就在于各層之間的嚴(yán)格分離,但Controller層和Model經(jīng)常容易被混淆在一起,這樣會(huì)導(dǎo)致mvc架構(gòu)失去原有的意義,我們需要清楚,控制層只實(shí)現(xiàn)簡(jiǎn)單的控制和邏輯處理,不涉及到具體的業(yè)務(wù)和數(shù)據(jù)交互,所有的具體操作都應(yīng)放到Model層。另外,這兩層中的類名和文件名也應(yīng)保持一致。
(5)方法控制
我們?cè)谕ㄟ^(guò)url的形式調(diào)用控制器及方法時(shí),某些方法是不想被外部調(diào)用到的,比如登錄檢查函數(shù),這個(gè)時(shí)候我們可以通過(guò)將函數(shù)定義為私有函數(shù)的方式避免其直接被通過(guò)url的形式調(diào)用到,來(lái)防止風(fēng)險(xiǎn)的發(fā)生。
(6)擴(kuò)展性設(shè)計(jì)
一個(gè)框架應(yīng)該具備好的擴(kuò)展性,尤其對(duì)于新外部庫(kù)引入,應(yīng)該能很容易通過(guò)簡(jiǎn)單修改就可以使用,因此應(yīng)該將配置項(xiàng)多帶帶分離存儲(chǔ)。
三、總結(jié)
該框架基本設(shè)計(jì)就是這個(gè)樣子,很簡(jiǎn)單,但基本實(shí)現(xiàn)了mvc架構(gòu),雖然和市面上的成熟框架相差很多,但重寫一遍對(duì)于mvc的架構(gòu)理解會(huì)更加深入,加之如今越來(lái)越多的網(wǎng)站都采用的這種單入口mvc架構(gòu),對(duì)于這類網(wǎng)站的滲透更需要很好的理解。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/22304.html
摘要:一個(gè)微型的實(shí)現(xiàn)的庫(kù)體積很小帶詳盡的注釋總共只有行支持鏈?zhǔn)秸{(diào)用支持關(guān)系前言最開(kāi)始接觸是在學(xué)習(xí)的時(shí)候,那個(gè)時(shí)候覺(jué)得用操作數(shù)據(jù)庫(kù)真的是太方便了。但是已經(jīng)算是一個(gè)小型的庫(kù)了。同樣的還提供了簡(jiǎn)寫的以及,等接口函數(shù)。 一個(gè)微型的PHP實(shí)現(xiàn)的AR庫(kù) 體積很小帶詳盡的注釋總共只有400行支持鏈?zhǔn)秸{(diào)用支持關(guān)系 前言 最開(kāi)始接觸ActiveRecord是在學(xué)習(xí)Yii的時(shí)候,那個(gè)時(shí)候覺(jué)得用AR操作數(shù)據(jù)庫(kù)真的...
摘要:每一個(gè)開(kāi)發(fā)者都知道,擁有一個(gè)強(qiáng)大的框架可以讓開(kāi)發(fā)工作變得更加快捷安全和有效。官方網(wǎng)站是一款老牌的框架,現(xiàn)在穩(wěn)定版本已經(jīng)是了。官方網(wǎng)站是由最大的社區(qū)之一的管理開(kāi)發(fā)的,也是一個(gè)開(kāi)源的框架。 對(duì)于Web開(kāi)發(fā)者來(lái)說(shuō),PHP是一款非常強(qiáng)大而又受歡迎的編程語(yǔ)言。世界上很多頂級(jí)的網(wǎng)站都是基于PHP開(kāi)發(fā)的。 每一個(gè)開(kāi)發(fā)者都知道,擁有一個(gè)強(qiáng)大的框架可以讓開(kāi)發(fā)工作變得更加快捷、安全和有效。在開(kāi)發(fā)項(xiàng)目之前選...
摘要:簡(jiǎn)單字符串緩存實(shí)戰(zhàn)完整實(shí)戰(zhàn)種設(shè)計(jì)模式設(shè)計(jì)模式是面向?qū)ο蟮淖罴褜?shí)踐成為專業(yè)程序員路上用到的各種優(yōu)秀資料神器及框架成為一名專業(yè)程序員的道路上,需要堅(jiān)持練習(xí)學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 微型新聞系統(tǒng)的開(kāi)發(fā)(PHP 5.4 + MySQL 5.5) 微型新聞系統(tǒng)的開(kāi)發(fā)(PHP 5.4 + MySQL 5.5) 九個(gè)很有用的 PHP 代碼 php 代碼 國(guó)內(nèi)值得關(guān)注的...
摘要:語(yǔ)言行為及特征狀態(tài)看不懂任何英語(yǔ)技術(shù),英語(yǔ)文檔,凡事沒(méi)有培訓(xùn)部在搞的,只有英文文檔的東西國(guó)內(nèi)一律沒(méi)大公司在用,都非主流,排斥英文文檔和新技術(shù),以及各種超出他學(xué)習(xí)能力范圍的技術(shù)。 在撰寫此文前首先必須申明的是本人不鄙視任何一種框架,也無(wú)意于挑起PHP框架間的戰(zhàn)爭(zhēng),更沒(méi)有貶低某個(gè)框架使用者的用意,本文純粹個(gè)人的看法。你可以認(rèn)為我無(wú)知也好,或者裝逼也好,請(qǐng)不要試著在任何情況下,隨便發(fā)起言語(yǔ)的...
摘要:所以,是幫助您創(chuàng)建您的項(xiàng)目的測(cè)試框架,單元測(cè)試。行為驅(qū)動(dòng)開(kāi)發(fā)是一個(gè)來(lái)自測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的開(kāi)發(fā)過(guò)程。這種語(yǔ)言被稱為,是用來(lái)描述被測(cè)試的預(yù)期的行為。代碼將被測(cè)試并且沒(méi)有異常。這些標(biāo)準(zhǔn)提出了現(xiàn)代編碼風(fēng)格。 本文來(lái)自medium----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050 你需要開(kāi)始使用測(cè)試 這是我每天對(duì)自己說(shuō)的話。像很多人一樣,我不會(huì)像TDD所建議的那樣測(cè)試...
閱讀 3124·2021-11-24 10:22
閱讀 3126·2021-11-23 10:10
閱讀 1463·2021-09-28 09:35
閱讀 1819·2019-08-29 13:16
閱讀 1467·2019-08-26 13:29
閱讀 2862·2019-08-26 10:27
閱讀 740·2019-08-26 10:09
閱讀 1526·2019-08-23 18:05