在說 MVC 架構以前,先說說PHP框架吧。不少不少學完PHP語言的人,面對的就是PHP各類各樣的框架。什麼TP啊、Yii啊、CI啊,還有很流行的laravel啊等等。php
他們的大部分都會說本身是基於 MVC 的架構,接着你得試着去理解 MVC 的邏輯,並嘗試着用這樣的邏輯去構建一個網站,而後會說 MVC 真香~前端
不少 PHP 的面試中,可能會問關於 MVC 的問題,好比 MVC 究竟是什麼意思,怎樣理解這種架構。然而不少人的理解是 model 是模型,他對應着數據庫中的表結構;view 對應着頁面,用於展現;controller 主要用來寫各類邏輯,關聯數據和頁面的顯示。vue
以上回答基本上沒有問題,但一個網站的結構真的有那麼簡單麼?顯然不是laravel
在說以前,首先讓咱們瞭解一下設計模式的一種:中介者模式。一個形象的理解就是:港行插頭和國行插頭的轉接頭。面試
在 MVC 架構中 controller 就是這個轉接頭。它只負責把 model 中的數據轉接給 view,對於訪問者來講,他們是看不到 model 中保存的真實數據的。從另一個角度來講,這種中介者模式能夠很好的將兩層數據進行友好的通訊。數據庫
這種模式真的那麼好麼?隨着業務邏輯的愈來愈複雜,會發現 controller 中的代碼愈來愈多,甚至本身都不肯去調整和優化冗餘代碼。編程
但從宏觀上來講,網站無非是請求多一些,表單多一些,頁面多一些啊,其餘也沒什麼了,爲何會這樣呢?後端
沒錯,就是由於這樣或那樣的東西比較多,致使 controller 中每一個方法都很長,那麼能想到的解決方法就是拆分。設計模式
若是用過 yii 框架,那麼你會知道最簡單的辦法是加一個請求form層,代碼以下:架構
class AuthController { public function login() { $FLogin = new loginForm(); $FLogin->save(); } } // 通常在獨立的文件夾中 class loginForm { public function __construct() { $post = $_POST; } public function save() { } }
以上的就是解決 controller 中 form 表單的問題,這個問題基本上能緩解不少代碼問題。
從解決 form 層來看,其實有不少相似的問題都能解決。咱們知道前端有個叫作 vue.js 的框架,它裏面提到一個概念叫作 MVVM 模型。
其實在展示覆雜頁面的時候,後端在對外輸出數據時,徹底也能夠採用這玩意進行數據輸出。至於如何創建這樣的一個模型,那就具體得看業務邏輯了。
這裏簡單拿用戶中心舉個例子,由於每每這裏不只僅須要一個表的數據:
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() { } }
以上代碼中,有個 VM 層,能夠將相關獲取數據的代碼放在各自的方法中,而後在 handle 方法中自由組合。這樣在 controller 中的代碼也很是便於管理。
再想一想,有沒有能夠封裝的其餘層呢?實際上是有的,好比 request 層,還有常常被框架封裝好的 validate 層,還有 laravel 中比較流行的 Middleware 層等等。只能說系統越複雜,層越多。
每一個複雜系統的背後都蘊含着高級開發工程師和架構師的設計思路。以上說那麼多,不知道讀者可否理解這些東西,就拿以上代碼來講,裏面就蘊含着另外一種設計模式:建造者模式。
代碼寫多了,也就知道其中蘊含的道理了。當一個新框架誕生後,關注點從學習這個框架,慢慢變成了這個框架是如何設計的,解決什麼樣的問題。哪些地方用了比較好的技術和方法,從中能收穫到什麼。一些地方的設計思路是什麼樣的,有麼有更好的設計,爲什麼我能想到,對方想不到呢,是否是我遺漏了什麼。
前幾年使用過各類 PHP 框架,小到 CI,大到 Symfony。不用那麼多框架,也體會不到這些東西。學習編程其實和英語同樣,沒什麼捷徑能夠走。
多寫,多想,多練......
以上