摘要:前言在說(shuō)架構(gòu)之前,先說(shuō)說(shuō)框架吧。在架構(gòu)中就是這個(gè)轉(zhuǎn)接頭。當(dāng)一個(gè)新框架誕生后,關(guān)注點(diǎn)從學(xué)習(xí)這個(gè)框架,慢慢變成了這個(gè)框架是如何設(shè)計(jì)的,解決什么樣的問(wèn)題。前幾年使用過(guò)各種框架,小到,大到。
前言
在說(shuō) MVC 架構(gòu)之前,先說(shuō)說(shuō)PHP框架吧。很多很多學(xué)完P(guān)HP語(yǔ)言的人,面對(duì)的就是PHP各種各樣的框架。什么TP啊、Yii啊、CI啊,還有很流行的laravel啊等等。
他們的大部分都會(huì)說(shuō)自己是基于 MVC 的架構(gòu),接著你得試著去理解 MVC 的邏輯,并嘗試著用這樣的邏輯去構(gòu)建一個(gè)網(wǎng)站,然后會(huì)說(shuō) MVC 真香~
面試很多 PHP 的面試中,可能會(huì)問(wèn)關(guān)于 MVC 的問(wèn)題,比如 MVC 到底是什么意思,怎樣理解這種架構(gòu)。然而很多人的理解是 model 是模型,他對(duì)應(yīng)著數(shù)據(jù)庫(kù)中的表結(jié)構(gòu);view 對(duì)應(yīng)著頁(yè)面,用于展示;controller 主要用來(lái)寫各種邏輯,關(guān)聯(lián)數(shù)據(jù)和頁(yè)面的顯示。
以上回答基本上沒(méi)有問(wèn)題,但一個(gè)網(wǎng)站的結(jié)構(gòu)真的有那么簡(jiǎn)單么?顯然不是
設(shè)計(jì)在說(shuō)之前,首先讓我們了解一下設(shè)計(jì)模式的一種:中介者模式。一個(gè)形象的理解就是:港行插頭和國(guó)行插頭的轉(zhuǎn)接頭。
在 MVC 架構(gòu)中 controller 就是這個(gè)轉(zhuǎn)接頭。它只負(fù)責(zé)把 model 中的數(shù)據(jù)轉(zhuǎn)接給 view,對(duì)于訪問(wèn)者來(lái)說(shuō),他們是看不到 model 中保存的真實(shí)數(shù)據(jù)的。從另外一個(gè)角度來(lái)說(shuō),這種中介者模式可以很好的將兩層數(shù)據(jù)進(jìn)行友好的通信。
爬坑這種模式真的那么好么?隨著業(yè)務(wù)邏輯的越來(lái)越復(fù)雜,會(huì)發(fā)現(xiàn) controller 中的代碼越來(lái)越多,甚至自己都不愿去調(diào)整和優(yōu)化冗余代碼。
但從宏觀上來(lái)說(shuō),網(wǎng)站無(wú)非是請(qǐng)求多一些,表單多一些,頁(yè)面多一些啊,其他也沒(méi)什么了,為什么會(huì)這樣呢?
沒(méi)錯(cuò),就是因?yàn)檫@樣或那樣的東西比較多,導(dǎo)致 controller 中每個(gè)方法都很長(zhǎng),那么能想到的解決方法就是拆分。
如果用過(guò) yii 框架,那么你會(huì)知道最簡(jiǎn)單的辦法是加一個(gè)請(qǐng)求form層,代碼如下:
class AuthController { public function login() { $FLogin = new loginForm(); $FLogin->save(); } } // 一般在獨(dú)立的文件夾中 class loginForm { public function __construct() { $post = $_POST; } public function save() { } }
以上的就是解決 controller 中 form 表單的問(wèn)題,這個(gè)問(wèn)題基本上能緩解很多代碼問(wèn)題。
發(fā)散從解決 form 層來(lái)看,其實(shí)有很多類似的問(wèn)題都能解決。我們知道前端有個(gè)叫做 vue.js 的框架,它里面提到一個(gè)概念叫做 MVVM 模型。
其實(shí)在展現(xiàn)復(fù)雜頁(yè)面的時(shí)候,后端在對(duì)外輸出數(shù)據(jù)時(shí),完全也可以采用這玩意進(jìn)行數(shù)據(jù)輸出。至于如何建立這樣的一個(gè)模型,那就具體得看業(yè)務(wù)邏輯了。
這里簡(jiǎn)單拿用戶中心舉個(gè)例子,因?yàn)橥@里不僅僅需要一個(gè)表的數(shù)據(jù):
class AuthController { public function userCenterAction() { return new userVM(); } } class userVM { public $user; public $orders; public $other; public function __construct() { $this->user = $this->getUser(); $this->orders = $this->getOrders(); $this->handle(); } private function getUser() { return NULL; } private function getOrders() { return NULL; } private function handle() { } }
以上代碼中,有個(gè) VM 層,可以將相關(guān)獲取數(shù)據(jù)的代碼放在各自的方法中,然后在 handle 方法中自由組合。這樣在 controller 中的代碼也非常便于管理。
再想想,有沒(méi)有可以封裝的其他層呢?其實(shí)是有的,比如 request 層,還有經(jīng)常被框架封裝好的 validate 層,還有 laravel 中比較流行的 Middleware 層等等。只能說(shuō)系統(tǒng)越復(fù)雜,層越多。
每個(gè)復(fù)雜系統(tǒng)的背后都蘊(yùn)含著高級(jí)開(kāi)發(fā)工程師和架構(gòu)師的設(shè)計(jì)思路。以上說(shuō)那么多,不知道讀者能否理解這些東西,就拿以上代碼來(lái)說(shuō),里面就蘊(yùn)含著另一種設(shè)計(jì)模式:建造者模式。
總結(jié)代碼寫多了,也就知道其中蘊(yùn)含的道理了。當(dāng)一個(gè)新框架誕生后,關(guān)注點(diǎn)從學(xué)習(xí)這個(gè)框架,慢慢變成了這個(gè)框架是如何設(shè)計(jì)的,解決什么樣的問(wèn)題。哪些地方用了比較好的技術(shù)和方法,從中能收獲到什么。一些地方的設(shè)計(jì)思路是什么樣的,有么有更好的設(shè)計(jì),為何我能想到,對(duì)方想不到呢,是不是我遺漏了什么。
前幾年使用過(guò)各種 PHP 框架,小到 CI,大到 Symfony。不用那么多框架,也體會(huì)不到這些東西。學(xué)習(xí)編程其實(shí)和英語(yǔ)一樣,沒(méi)什么捷徑可以走。
多寫,多想,多練......
以上
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/31012.html
摘要:但是模型中數(shù)據(jù)的變化一般會(huì)通過(guò)一種刷新機(jī)制被公布。它處理事件并作出響應(yīng)。事件包括用戶的行為和數(shù)據(jù)模型上的改變。三開(kāi)始開(kāi)發(fā)自己的框架在開(kāi)始開(kāi)發(fā)前,讓我們先來(lái)把項(xiàng)目建立好,假設(shè)我們建立的項(xiàng)目為,那么接下來(lái)的第一步就是把目錄結(jié)構(gòu)先設(shè)置好。 現(xiàn)如今市面上有許多PHP框架,像 ThinkPHP、YII、Laravel,那么如何自己搭建一個(gè)PHP框架呢?這里有一篇博文寫的非常好,特意轉(zhuǎn)載過(guò)來(lái),供朋...
摘要:寫在前面關(guān)于軟件架構(gòu)模式確切的說(shuō)是一種軟件編碼規(guī)范或者軟件開(kāi)發(fā)模式,這幾年罵戰(zhàn)不斷。由微軟架構(gòu)師和開(kāi)發(fā),通過(guò)利用微軟圖形系統(tǒng)和的互聯(lián)網(wǎng)應(yīng)用派生品的特性來(lái)簡(jiǎn)化用戶界面的事件驅(qū)動(dòng)程序設(shè)計(jì)。微軟的和架構(gòu)師之一于年在他的博客上發(fā)表了。寫在前面 關(guān)于軟件架構(gòu)模式(確切的說(shuō)是一種軟件編碼規(guī)范或者軟件開(kāi)發(fā)模式),這幾年罵戰(zhàn)不斷。爭(zhēng)論的焦點(diǎn)主要是在MVC、MVVM、MVP哪種架構(gòu)最好,哪種架構(gòu)才是最牛逼的、...
摘要:的最后一個(gè)大招就是替換一些傳統(tǒng)的服務(wù)端語(yǔ)言,例如,,等,在業(yè)務(wù)層上面使用來(lái)開(kāi)發(fā)服務(wù)端完全不成問(wèn)題。更多的的使用細(xì)節(jié)和技巧建議關(guān)注美團(tuán)博客大搜車論壇下一篇我們開(kāi)啟如何結(jié)合和搭建一個(gè)開(kāi)發(fā)環(huán)境和項(xiàng)目目錄 往期回顧 前面2期都講得是瀏覽器端的東西比較多,包括Webpack,雖然是Node處理的,但是還是瀏覽器端用的多,對(duì)于現(xiàn)在的前端開(kāi)發(fā)來(lái)說(shuō),不懂一點(diǎn)服務(wù)端的東西,簡(jiǎn)直沒(méi)辦法活,一般的招聘要求都...
摘要:本文會(huì)以引出問(wèn)題為主,后面有時(shí)間的話,筆者陸續(xù)會(huì)抽些重要的知識(shí)點(diǎn)進(jìn)行詳細(xì)的剖析與解答。敬請(qǐng)關(guān)注服務(wù)端思維微信公眾號(hào),獲取最新文章。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 這里,筆者結(jié)合自己過(guò)往的面試經(jīng)驗(yàn),整理了一些核心的知識(shí)清單,幫助讀者更好地回顧與復(fù)習(xí) Java 服務(wù)端核心技術(shù)。本文會(huì)以引出問(wèn)題為主,后面有時(shí)間的話,筆者陸續(xù)會(huì)抽些重要的知識(shí)點(diǎn)進(jìn)...
摘要:容器自動(dòng)完成裝載,默認(rèn)的方式是這部分重點(diǎn)在常用模塊的使用以及的底層實(shí)現(xiàn)原理。 對(duì)于那些想面試高級(jí) Java 崗位的同學(xué)來(lái)說(shuō),除了算法屬于比較「天方夜譚」的題目外,剩下針對(duì)實(shí)際工作的題目就屬于真正的本事了,熱門技術(shù)的細(xì)節(jié)和難點(diǎn)成為了主要考察的內(nèi)容。 這里說(shuō)「天方夜譚」并不是說(shuō)算法沒(méi)用,不切實(shí)際,而是想說(shuō)算法平時(shí)其實(shí)很少用到,甚至面試官都對(duì)自己出的算法題一知半解。 這里總結(jié)打磨了 70 道...
閱讀 1781·2021-11-22 15:33
閱讀 2191·2021-10-08 10:04
閱讀 3608·2021-08-27 13:12
閱讀 3484·2019-08-30 13:06
閱讀 1526·2019-08-29 16:43
閱讀 1462·2019-08-29 16:40
閱讀 855·2019-08-29 16:15
閱讀 2824·2019-08-29 14:13