Laravel框架的核心架構,你懂多少?

Laravel00發表於2021-02-21

文章來自:mp.weixin.qq.com/s/RdYVDZPJic0aGPn...
學習與交流:Laravel技術交流微信群

使用過larave框架的朋友都知道laravel框架裡面除了提供一些基本的功能(如控制器、檢視、模型)之外,還有中介軟體、門面、契約等,這些東西是如何在laravel框架運用起來的呢?今天就和大家詳聊一下。

首先應該瞭解laravel框架的架構模式(設計核心,laravel 框架是使用服務元件化的開發模式開發的,laravel框架就是由不同的服務元件構成的)

laravel 裡面多個服務提供者構成了laravel元件。分層設計:把相同功能的類庫放在同一個資料夾裡面。
laravel框架有多個類組成服務,由多個服務組成元件。類 -> 服務 -> 元件
laravel使用元件化的開發模式,多個類 -> 服務 -> 元件,多個類組成服務,多個服務構成元件

多個元件提供不同的服務,然後多個服務構成我們的專案。


請求生命週期
大概的流程如圖:
圖片

理論上,生命週期主要有這麼些階段,但其中,開發者大多數只需關注路由、中介軟體、控制器、閉包函式、邏輯處理等幾步
當然,每一步的內部,還是會有更多細化的執行流程,在這裡,一般不深入研究框架或改造框架,很少會細化研究,但研究底層,依舊是學習的好選擇。


服務
說的就是提供給你所需要的東西,在laravel裡面所提供的服務有 認證服務、資料庫服務、快取服務、佇列服務等等。laravel框架所有服務都定義在了app/config/app.php 裡面


服務提供者
可以給你提供一組服務的東西就是服務提供者,laravel裡面如上所示其實定義的伺服器提供者,比如IlluminateAuthAuthServiceProvider::class,提供認證服務的服務提供者。IlluminateCacheCacheServiceProvider::class,提供快取服務的服務提供者


好處:開發者可以節省下更多的精力去處理專案邏輯,且不同開發個體之間能達到一定默契,最重要的是,專案達到分層解耦,業務邏輯只依賴於服務,並不依賴於服務底層的實現。
解耦之後,我們可以任意升級或自定義服務的底層實現,只要確保底層類實現了該服務


總結:其實服務是一個抽象的概念,伺服器提供者是完成這個抽象概念的具體實施者


服務容器
把所有的服務放在一個盒子裡,存放服務的容器。laravel裡面的服務容器位於

vendor/laravel/frameworksrcilluminateContainerContainer.php.

Container.php 就是laravel框架的服務容器。


契約
用來規劃服務提供者的格式、方法、引數等,給服務提供者規範了一定約束。所以在框架裡面所有的契約都是介面,這樣才能規範服務提供者。


門面
門面再一次展示了Laravel在設計上的優秀,它讓Laravel變得更加靈活易擴充套件,那麼它的概念是:
1 為開發者提供服務容器中服務的靜態代理

2 它對服務訪問方式做了補充,之前使用服務必須獲取服務的例項,再呼叫服務的方法,但使用facade,就可以直接把服務當靜態物件來呼叫了。

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

4 使用facade是有風險的,並不是用的越多越好,這在手冊上有少量的介紹,但具體的,還是需要開發中去發現


laravel框架總體架構圖
圖片
如上圖所示:laravel框架是由多個服務元件構成的 -> 服務提供者(最下面的不同的服務元件)。
FoundationApplication 用來建立服務提供者,建立好之後儲存在ContainerContainer 的服務容器裡面,交由他管理,Application 要繼承 Container
為了約定服務提供者提供的服務,我們定義一個規範,這就是契約

對於我們的使用者(最上面的使用者)想使用laravel框架,必須通過控制器來使用(上面的Controller),使用laravel框架主要是使用laravel裡面的服務提供者(上面的 new 服務),這樣就是最傳統的開發模式,和伺服器容器沒有直接關係,如果laravel這樣設計的話,基本上和其他框架一樣,沒有任何優勢。所以一般不怎麼做。

由於有契約,契約是服提供者的介面,所以我們也可以直接使用契約,new 服務旁邊的黃色線。使用契約用注入的方式,這樣使用的不好之處是如果一個方法裡面使用多個契約的話,我們就得注入多個契約,這樣程式碼看起來不優雅。


於是laravel裡面就出現了門面,門面的出現方便我們優雅的呼叫伺服器提供者的類。由於每個服務提供者的類太長了如:

IlluminateCookieCookieServiceProvider::class,IlluminateDatabaseDatabaseServiceProvider::class,

所以又引出了別名,使用別名之後 簡化了我們呼叫的服務提供者的類。

事件:laravel裡面的模型裡面的事件,比如使用者對資料庫操作時做的一個監聽。對整個專案執行進行監聽,有監聽的動作。類似tp5裡面的鉤子和行為。
中介軟體:做使用者的請求做一定的過濾。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章