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