天天看點

Laravel核心解讀--HTTP核心

http kernel

http kernel是laravel中用來串聯架構的各個核心元件來網絡請求的,簡單的說隻要是通過​<code>​public/index.php​</code>​來啟動架構的都會用到http kernel,而另外的類似通過​<code>​artisan​</code>​指令、計劃任務、隊列啟動架構進行處理的都會用到console kernel, 今天我們先梳理一下http kernel做的事情。

​​laravel核心解讀--contracts契約​​

既然http kernel是laravel中用來串聯架構的各個部分處理網絡請求的,我們來看一下核心是怎麼加載到laravel中應用執行個體中來的,在​<code>​public/index.php​</code>​中我們就會看見首先就會通過​<code>​bootstrap/app.php​</code>​這個腳手架檔案來初始化應用程式:

下面是 ​<code>​bootstrap/app.php​</code>​ 的代碼,包含兩個主要部分建立應用執行個體和綁定核心至 app 服務容器

http 核心繼承自 illuminatefoundationhttpkernel類,在 http 核心中 内它定義了中間件相關數組, 中間件提供了一種友善的機制來過濾進入應用的 http 請求和加工流出應用的http響應。

在其父類 「illuminatefoundationhttpkernel」 内部定義了屬性名為 「bootstrappers」 的 引導程式 數組:

引導程式組中 包括完成環境檢測、配置加載、異常處理、facades 注冊、服務提供者注冊、啟動服務這六個引導程式。

有關中間件和引導程式相關内容的講解可以浏覽我們之前相關章節的内容。

在将應用初始化階段将http核心綁定至應用的服務容器後,緊接着在​<code>​public/index.php​</code>​中我們可以看到使用了服務容器的​<code>​make​</code>​方法将http核心執行個體解析了出來:

在執行個體化核心時,将在 http 核心中定義的中間件注冊到了 ​​路由器​​,注冊完後就可以在實際處理 http 請求前調用路由上應用的中間件實作過濾請求的目的:

通過服務解析完成http核心執行個體的建立後就可以用http核心執行個體來處理http請求了

在處理請求之前會先通過​<code>​illuminate\http\request​</code>​的 ​<code>​capture()​</code>​ 方法以進入應用的http請求的資訊為基礎建立出一個 laravel request請求執行個體,在後續應用剩餘的生命周期中​<code>​request​</code>​請求執行個體就是對本次http請求的抽象,關于​​laravel request請求執行個體​​的講解可以參考以前的章節。

将http請求抽象成​<code>​laravel request請求執行個體​</code>​後,請求執行個體會被傳導進入到http核心的​<code>​handle​</code>​方法内部,請求的處理就是由​<code>​handle​</code>​方法來完成的。

​<code>​handle​</code>​ 方法接收一個請求對象,并最終生成一個響應對象。其實​<code>​handle​</code>​方法我們已經很熟悉了在講解很多子產品的時候都是以它為出發點逐漸深入到子產品的内部去講解子產品内的邏輯的,其中​<code>​sendrequestthroughrouter​</code>​方法在服務提供者和中間件都提到過,它會加載在核心中定義的引導程式來引導啟動應用然後會将使用​<code>​pipeline​</code>​對象傳輸http請求對象流經架構中定義的http中間件們和路由中間件們來完成過濾請求最終将請求傳遞給處理程式(控制器方法或者路由中的閉包)由處理程式傳回相應的響應。關于​<code>​handle​</code>​方法的注解我直接引用以前章節的講解放在這裡,具體更詳細的分析具體是如何引導啟動應用以及如何将傳輸流經各個中間件并到達處理程式的内容請檢視​​服務提供器​​、​​中間件​​還有​​路由​​這三個章節。

經過上面的幾個階段後我們最終拿到了要傳回的響應,接下來就是發送響應了。

發送響應由 ​<code>​illuminate\http\response​</code>​的​<code>​send()​</code>​方法完成父類其定義在父類​<code>​symfony\component\httpfoundation\response​</code>​中。

關于response對象的詳細分析可以參看我們之前講解laravel response對象的章節。

響應發送後,http核心會調用​<code>​terminable​</code>​中間件做一些後續的處理工作。比如,laravel 内置的「session」中間件會在響應發送到浏覽器之後将會話資料寫入存儲器中。

http核心的​<code>​terminate​</code>​方法會調用​<code>​teminable​</code>​中間件的​<code>​terminate​</code>​方法,調用完成後從http請求進來到傳回響應整個應用程式的生命周期就結束了。

本節介紹的http核心起到的主要是串聯作用,其中設計到的初始化應用、引導應用、将http請求抽象成request對象、傳遞request對象通過中間件到達處理程式生成響應以及響應發送給用戶端。這些東西在之前的章節裡都有講過,并沒有什麼新的東西,希望通過這篇文章能讓大家把之前文章裡講到的每個點串成一條線,這樣對laravel整體是怎麼工作的會有更清晰的概念。

本文已經收錄在系列文章laravel源碼學習裡,歡迎通路閱讀。