摘要:假設(shè)我們站點(diǎn)的域名是,用戶請(qǐng)求地址。模型層我們可以將數(shù)據(jù)組織和處理邏輯放在模型層,這里封裝了數(shù)據(jù)庫(kù)操作,甚至有些大型的框架會(huì)在這一層對(duì)這個(gè)數(shù)據(jù)庫(kù)進(jìn)行對(duì)象化,目的都是為了組織和處理數(shù)據(jù),然后將處理好的數(shù)據(jù)返回給控制器層。
1. 控制器作者:Terry Gao
第一篇我們聊到路由分發(fā)會(huì)把用戶請(qǐng)求按照規(guī)則分發(fā)到控制器層的不同類,而默認(rèn)的規(guī)則中,請(qǐng)求會(huì)下發(fā)到控制器的index類的main方法,我們可以在這個(gè)方法中處理用戶請(qǐng)求,并將處理結(jié)果呈現(xiàn)給用戶。來(lái)看看源碼
/* Nova/Application/Controllers/index.php */很基礎(chǔ),很簡(jiǎn)單,就是輸出一個(gè)"Hello World!"。你會(huì)說(shuō)“用戶的請(qǐng)求呢?用戶的請(qǐng)求體現(xiàn)在哪里?我沒(méi)看出來(lái)啊!”
好吧,我們來(lái)稍微復(fù)雜一點(diǎn)。假設(shè)我們站點(diǎn)的域名是nova.local,用戶請(qǐng)求地址:http://nova.local/?act=user&s...。根據(jù)Nova的路由規(guī)則,act=user意味著它請(qǐng)求的是NovaApplicationControllersuser.php的user類,st=info對(duì)應(yīng)著user::info()方法,用來(lái)獲取用戶信息,而id=1則是user::info需要通過(guò)GET接收的一個(gè)參數(shù),我們可以在user::info中對(duì)id進(jìn)行解析和處理,獲取id為1的用戶信息,然后輸出給用戶。源代碼如下:
/* Nova/Application/Controllers/user.php */ getUserInfo($_GET["id"]); print_r($userInfo); } }上面的代碼,沒(méi)什么安全性可言,GET的信息沒(méi)有任何過(guò)濾和校驗(yàn),由于這個(gè)系列文章只是介紹基本的框架思路,所以這部分內(nèi)容不是我們的重點(diǎn),請(qǐng)暫且忽略(如果你實(shí)在看不下去如此ugly的代碼,可以在Github上Fork Nova項(xiàng)目,然后提Pull Request給我)。
在info()方法中,我們新建了一個(gè)Modelsuser類,然后調(diào)用Modelsuser::getUserInfo()方法,來(lái)處理$_GET["id"],并將獲取到的用戶信息通過(guò)print_r()方法打印出來(lái)。這里的Modelsuser類就是MVC中M層的一個(gè)實(shí)現(xiàn)。
2. 模型層我們可以將數(shù)據(jù)組織和處理邏輯放在模型層,這里封裝了數(shù)據(jù)庫(kù)操作,甚至有些大型的框架會(huì)在這一層對(duì)這個(gè)數(shù)據(jù)庫(kù)進(jìn)行對(duì)象化,目的都是為了組織和處理數(shù)據(jù),然后將處理好的數(shù)據(jù)返回給控制器層。上一節(jié)提到的Modelsuser類就是一個(gè)專門用于處理用戶數(shù)據(jù)的模型類,來(lái)看看源碼:
/* Nova/Application/Models/user.php */ db = PDOMysql::connect()->db; } /** * 根據(jù)用戶id查詢用戶信息并返回查詢結(jié)果 * * @return array */ public function getUserInfo($userId) { $sql = "select * from user where id=:userId"; $stmt = $this->db->prepare($sql); $params = array(":userId" => $userId); $stmt->execute($params); return $stmt->fetch(); } }這個(gè)類在構(gòu)造的時(shí)候創(chuàng)建了一個(gè)數(shù)據(jù)庫(kù)連接,然后在getUserInfo()方法中根據(jù)傳入的用戶id查詢對(duì)應(yīng)的用戶信息,并將查詢結(jié)果返回給調(diào)用者(控制器)。
通過(guò)下圖來(lái)看看到目前為止,我們有什么了
好吧,看出來(lái)了,MVC的View沒(méi)有。View層有一個(gè)好東西,也許你聽過(guò),甚至你用過(guò),對(duì),就是Smarty,這么好的東西拿來(lái)直接用吧。把Smarty的源碼下載下來(lái),然后統(tǒng)統(tǒng)解壓到Nova/Application/Library/Smarty下面,我們要怎么把Smarty加載進(jìn)來(lái)呢?首先改造一下Controller層,新建一個(gè)Controllersbase.php,作為控制器層的基類,在這里我們引入并初始化一下Smarty,代碼如下:
/* Nova/Application/Controllers/base.php */ smarty = new Smarty(); //對(duì)smarty做一些基本設(shè)置 //設(shè)置模板的存放位置 $this->smarty->setTemplateDir(APP_DIR."/Views/"); //smarty編譯文件的存儲(chǔ)位置 $this->smarty->setCompileDir(ROOT_DIR."/compiled/"); //設(shè)置smarty配置文件的存放位置 $this->smarty->setConfigDir(CONFIG_DIR."/smarty/"); //smarty自帶緩存,設(shè)置緩存的存儲(chǔ)位置 $this->smarty->setCacheDir(ROOT_DIR."/cache/"); } }然后我們讓Controllersuser繼承Controllersbase,就可以使用smarty了
/* Nova/Application/Controllers/user.php */ getUserInfo($_GET["id"]); //將數(shù)據(jù)傳入給smarty $this->smarty->assign("user", $userInfo); //通過(guò)smarty的display函數(shù),調(diào)用index.tpl模板來(lái)顯示數(shù)據(jù) $this->smarty->display("index.tpl"); } }模板代碼如下:
/* Nova/Application/View/index.tpl */User Name: {$user["name"]}Password: {$user["password"]}至此,MVC齊全了,整個(gè)架子搭起來(lái)嘍。運(yùn)行一下試試看吧。
你可以在Github上查看Nova項(xiàng)目的源代碼。如果你有任何問(wèn)題或建議,可以掃描下方二維碼或者微信搜索[phpjiagoushier],關(guān)注我的微信公眾號(hào)[PHP架構(gòu)],與我交流互動(dòng)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22576.html
摘要:作者作為的入門進(jìn)階,自己動(dòng)手寫一個(gè)框架可以從各方面鞏固和加深你對(duì)的理解,還能了解一些架構(gòu)方面的基礎(chǔ)知識(shí)。它將程序劃分為三層。最上面的一層,是直接面向最終用戶的視圖層。最底下的一層,是核心的模型層,負(fù)責(zé)檢索組織和處理程序所需的數(shù)據(jù)或信息。 作者:Terry Gao 作為PHP Coder的入門進(jìn)階,自己動(dòng)手寫一個(gè)MVC框架可以從各方面鞏固和加深你對(duì)PHP的理解,還能了解一些架構(gòu)方面的基礎(chǔ)...
摘要:作者上一篇提到了類的自動(dòng)加載和,今天就來(lái)逐一說(shuō)說(shuō)。為這個(gè)問(wèn)題提供了一個(gè)解決方案,這就是類的自動(dòng)裝載機(jī)制。為了方便使用自定義的全局,把方法也重寫了。 作者:Terry Gao 上一篇提到了類的自動(dòng)加載和Session,今天就來(lái)逐一說(shuō)說(shuō)。 1. 類的自動(dòng)加載 在使用PHP的OO模式開發(fā)系統(tǒng)時(shí),通常大家習(xí)慣將每個(gè)類的實(shí)現(xiàn)都存放在一個(gè)單獨(dú)的文件里,這樣會(huì)很容易實(shí)現(xiàn)對(duì)類進(jìn)行復(fù)用,同時(shí)將來(lái)維護(hù)時(shí)也...
摘要:后端開發(fā)的疑惑后端開發(fā)最常面對(duì)的一個(gè)問(wèn)題性能高并發(fā)等等。而到了時(shí)代,在方面有了前后端分離概念移動(dòng)后端更是無(wú)力渲染天然前后端分離。 先來(lái)上一張前端頁(yè)面的效果圖(Vue + Vux + Vuex + Vue-Router)。showImg(https://segmentfault.com/img/remote/1460000010207850); 第一次做gif 沒(méi)什么經(jīng)驗(yàn),太大了。加載...
摘要:服務(wù)器通過(guò)協(xié)議與客戶端通信,因此也被稱為服務(wù)器。本文標(biāo)題為從零開始搭建論壇一服務(wù)器與框架本文鏈接為更多閱讀自己動(dòng)手開發(fā)網(wǎng)絡(luò)服務(wù)器一自己動(dòng)手開發(fā)網(wǎng)絡(luò)服務(wù)器二自己動(dòng)手開發(fā)網(wǎng)絡(luò)服務(wù)器三服務(wù)器網(wǎng)關(guān)接口實(shí)現(xiàn)原理分析最佳實(shí)踐指南應(yīng)用淺談框架編程簡(jiǎn)介 之前用 Django 做過(guò)一個(gè)小的站點(diǎn),感覺Django太過(guò)笨重,于是就準(zhǔn)備換一個(gè)比較輕量級(jí)的 Web 框架來(lái)玩玩。Web.py 作者已經(jīng)掛掉,項(xiàng)目好...
閱讀 1408·2021-11-15 18:11
閱讀 2535·2021-08-19 10:56
閱讀 706·2021-08-09 13:42
閱讀 830·2019-08-30 15:53
閱讀 2110·2019-08-30 10:55
閱讀 3181·2019-08-29 17:18
閱讀 1475·2019-08-29 13:45
閱讀 570·2019-08-29 13:15