溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP框架中MVC架構(gòu)的案例分析

發(fā)布時(shí)間:2020-10-28 21:32:32 來(lái)源:億速云 閱讀:149 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)PHP框架中MVC架構(gòu)的案例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

在說(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è)面的顯示。

以上回答基本上沒有問(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è)面多一些啊,其他也沒什么了,為什么會(huì)這樣呢?

沒錯(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 中的代碼也非常便于管理。

再想想,有沒有可以封裝的其他層呢?其實(shí)是有的,比如 request 層,還有經(jīng)常被框架封裝好的 validate 層,還有 laravel 中比較流行的 Middleware 層等等。只能說(shuō)系統(tǒng)越復(fù)雜,層越多。

每個(gè)復(fù)雜系統(tǒng)的背后都蘊(yùn)含著高級(jí)開發(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ǔ)一樣,沒什么捷徑可以走。

感謝各位的閱讀!關(guān)于PHP框架中MVC架構(gòu)的案例分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI