詳解Laravel框架的核心架構(gòu)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

下面由laravel教程欄目給大家介紹詳解Laravel框架的核心架構(gòu) ,希望對(duì)需要的朋友有所幫助!

詳解Laravel框架的核心架構(gòu)

?
使用過(guò)larave框架的朋友都知道laravel框架里面除了提供一些基本的功能(如控制器、視圖、模型)之外,還有中間件、門面、契約等,這些東西是如何在laravel框架運(yùn)用起來(lái)的呢?今天就和大家詳聊一下。

首先應(yīng)該了解laravel框架的架構(gòu)模式(設(shè)計(jì)核心,laravel 框架是使用服務(wù)組件化的開(kāi)發(fā)模式開(kāi)發(fā)的,laravel框架就是由不同的服務(wù)組件構(gòu)成的)

laravel 里面多個(gè)服務(wù)提供者構(gòu)成了laravel組件。分層設(shè)計(jì):把相同功能的類庫(kù)放在同一個(gè)文件夾里面。
laravel框架有多個(gè)類組成服務(wù),由多個(gè)服務(wù)組成組件。類 ?-> 服務(wù) ?-> ?組件
laravel使用組件化的開(kāi)發(fā)模式,多個(gè)類 -> 服務(wù) -> 組件,多個(gè)類組成服務(wù),多個(gè)服務(wù)構(gòu)成組件

多個(gè)組件提供不同的服務(wù),然后多個(gè)服務(wù)構(gòu)成我們的項(xiàng)目。

請(qǐng)求生命周期
大概的流程如圖:
詳解Laravel框架的核心架構(gòu)

理論上,生命周期主要有這么些階段,但其中,開(kāi)發(fā)者大多數(shù)只需關(guān)注路由、中間件、控制器、閉包函數(shù)、邏輯處理等幾步
當(dāng)然,每一步的內(nèi)部,還是會(huì)有更多細(xì)化的執(zhí)行流程,在這里,一般不深入研究框架或改造框架,很少會(huì)細(xì)化研究,但研究底層,依舊是學(xué)習(xí)的好選擇。

服務(wù)
說(shuō)的就是提供給你所需要的東西,在laravel里面所提供的服務(wù)有 認(rèn)證服務(wù)、數(shù)據(jù)庫(kù)服務(wù)、緩存服務(wù)、隊(duì)列服務(wù)等等。laravel框架所有服務(wù)都定義在了app/config/app.php 里面

?
服務(wù)提供者
可以給你提供一組服務(wù)的東西就是服務(wù)提供者,laravel里面如上所示其實(shí)定義的服務(wù)器提供者,比如IlluminateAuthAuthServiceProvider::class,提供認(rèn)證服務(wù)的服務(wù)提供者。IlluminateCacheCacheServiceProvider::class,提供緩存服務(wù)的服務(wù)提供者

好處:開(kāi)發(fā)者可以節(jié)省下更多的精力去處理項(xiàng)目邏輯,且不同開(kāi)發(fā)個(gè)體之間能達(dá)到一定默契,最重要的是,項(xiàng)目達(dá)到分層解耦,業(yè)務(wù)邏輯只依賴于服務(wù),并不依賴于服務(wù)底層的實(shí)現(xiàn)。
解耦之后,我們可以任意升級(jí)或自定義服務(wù)的底層實(shí)現(xiàn),只要確保底層類實(shí)現(xiàn)了該服務(wù)

總結(jié):其實(shí)服務(wù)是一個(gè)抽象的概念,服務(wù)器提供者是完成這個(gè)抽象概念的具體實(shí)施者

服務(wù)容器
把所有的服務(wù)放在一個(gè)盒子里,存放服務(wù)的容器。laravel里面的服務(wù)容器位于

vendor/laravel/frameworksrcilluminateContainerContainer.php.

Container.php ?就是laravel框架的服務(wù)容器。

契約
用來(lái)規(guī)劃服務(wù)提供者的格式、方法、參數(shù)等,給服務(wù)提供者規(guī)范了一定約束。所以在框架里面所有的契約都是接口,這樣才能規(guī)范服務(wù)提供者。

?
門面
門面再一次展示了Laravel在設(shè)計(jì)上的優(yōu)秀,它讓Laravel變得更加靈活易擴(kuò)展,那么它的概念是:
1 為開(kāi)發(fā)者提供服務(wù)容器中服務(wù)的靜態(tài)代理

2 它對(duì)服務(wù)訪問(wèn)方式做了補(bǔ)充,之前使用服務(wù)必須獲取服務(wù)的實(shí)例,再調(diào)用服務(wù)的方法,但使用facade,就可以直接把服務(wù)當(dāng)靜態(tài)對(duì)象來(lái)調(diào)用了。

3 config/app.php中服務(wù)別名alias大多數(shù)都使用了facade

4 使用facade是有風(fēng)險(xiǎn)的,并不是用的越多越好,這在手冊(cè)上有少量的介紹,但具體的,還是需要開(kāi)發(fā)中去發(fā)現(xiàn)

?
laravel框架總體架構(gòu)圖
詳解Laravel框架的核心架構(gòu)

如上圖所示:laravel框架是由多個(gè)服務(wù)組件構(gòu)成的 -> 服務(wù)提供者(最下面的不同的服務(wù)組件)。
Foundation 的 Application 用來(lái)創(chuàng)建服務(wù)提供者,創(chuàng)建好之后保存在Container 的 Container 的服務(wù)容器里面,交由他管理,Application 要繼承 Container。
為了約定服務(wù)提供者提供的服務(wù),我們定義一個(gè)規(guī)范,這就是契約。
?
對(duì)于我們的用戶(最上面的用戶)想使用laravel框架,必須通過(guò)控制器來(lái)使用(上面的Controller),使用laravel框架主要是使用laravel里面的服務(wù)提供者(上面的 new 服務(wù)),這樣就是最傳統(tǒng)的開(kāi)發(fā)模式,和服務(wù)器容器沒(méi)有直接關(guān)系,如果laravel這樣設(shè)計(jì)的話,基本上和其他框架一樣,沒(méi)有任何優(yōu)勢(shì)。所以一般不怎么做。
?
由于有契約,契約是服提供者的接口,所以我們也可以直接使用契約,new 服務(wù)旁邊的黃色線。使用契約用注入的方式,這樣使用的不好之處是如果一個(gè)方法里面使用多個(gè)契約的話,我們就得注入多個(gè)契約,這樣代碼看起來(lái)不優(yōu)雅。

?
于是laravel里面就出現(xiàn)了門面,門面的出現(xiàn)方便我們優(yōu)雅的調(diào)用服務(wù)器提供者的類。由于每個(gè)服務(wù)提供者的類太長(zhǎng)了如:

IlluminateCookieCookieServiceProvider::class,IlluminateDatabaseDatabaseServiceProvider::class,

所以又引出了別名,使用別名之后 簡(jiǎn)化了我們調(diào)用的服務(wù)提供者的類。

事件laravel里面的模型里面的事件,比如用戶對(duì)數(shù)據(jù)庫(kù)操作時(shí)做的一個(gè)監(jiān)聽(tīng)。對(duì)整個(gè)項(xiàng)目運(yùn)行進(jìn)行監(jiān)聽(tīng),有監(jiān)聽(tīng)的動(dòng)作。類似tp5里面的鉤子和行為。
中間件:做用戶的請(qǐng)求做一定的過(guò)濾。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊10 分享