Laravel 請求生命週期

這是一篇翻譯文章,原文 Request Life Cycle of Laravel,譯文 Laravel 請求生命週期 首發於我的博客,轉載請註明出處。

當須要使用一個框架、工具或者服務時,在使用前應對其運行原理進行研究。隨着原理研究工做的不斷深刻,能讓咱們在使用時更駕輕就熟。php

這篇文章旨在幫助你們掌握 「Laravel HTTP 請求生命週期」 的工做原理。內容涵蓋當一個 HTTP 請求發送到 Laravel 服務後,這個請求在項目運行的各個階段是如何被處理的,而後框架又是如何將處理結果發送回用戶的。laravel

咱們會帶領你們一步步深刻挖掘出這其中的祕密。web

自動加載

第一步,當用戶在瀏覽器訪問 URL 時會發起一個 HTTP 請求,最終這個請求被髮送到咱們的 Web 服務器。Web 服務器(Apache 或 Nginx) 經過匹配的服務配置,再將請求發送到 Laravel 中的 入口文件 public/index.php,該文件完成項目依賴服務的加載功能。首先它將 composer 生成的自動加載器引入項目(譯註:require __DIR__.'/../vendor/autoload.php';)。bootstrap

而後接收由 bootstrap/app.php 文件建立的應用實例。建立實例的過程便是項目初始化的過程。api

內核

下一步:咱們將焦點鎖定到應用實例的內核部分。瀏覽器

應用實例根據 HTTP 請求的運行環境,來決定將請求發送到 HTTP 內核或 Console 內核。這兩個內核是全部 HTTP 請求的集散中心。服務器

HTTP 內核是定義在 app/Http/Kernel.php 文件內的 Kernel 實現類,它接收一個請求,而後返回一個響應,就是這麼簡單。不過,在 Kernel 類的內部有定義諸多的 引導程序(Bootstrappers),這些引導程序會完成錯誤句柄(handle)配置、日誌配置、運行環境識別和全部須要在請求被執行前完成的配置工做。網絡

不只如此,Kernel 類還定義了許多須要在請求被處理前須要被執行的中間件。併發

服務提供者

接下來,內核會在引導項目啓動時加載服務提供者。應用實例所依賴的服務提供者能夠在 config/app.php 配置文件中的 providers 節點找到。app

一個服務提供者的 register() 方法被調用時,這個服務提供者即被註冊到應用實例。完成全部服務提供者註冊到應用實例後,應用實例執行啓動方法(boot method)引導項目啓動。

分發請求

隨着應用實例完成引導、註冊服務器提供者和啓動等處理,接下來請求便會被路由器(Router)轉發。路由器將請求轉發至註冊的路由和對應的控制器(譯註:在 routes/web.php 或 routes/api.php 文件中定義的路由),而且執行當前路由相關的中間件。

路由器

如今到了請求被處理和渲染的環節:

Router will direct the HTTP Request to a Controller or return a view or responses directly by omitting the controller. These routes will be placed in app/routes.php.

路由器把 HTTP 請求發送到匹配的控制器或視圖。咱們能夠在 routes/web.php 中(譯註:原文定義在 app/routes.php 中,僅適用於 Laravel 5.3 以前)定義路由。

項目全部的控制器都管理在 app/Https/Controllers(譯註:原文 app/controllers) 目錄中,一個控制器對應一個操做,併發送數據到其視圖。

視圖文件被定義在 resources/views 目錄中,功能是輸出數據並響應 HTTP 請求。

下面的執行流程圖詳細描述了上述步驟的執行過程:

<img src="https://i0.wp.com/blog.mallow...; alt="HTTP 請求生命週期" />

一個 HTTP 請求實例

1

用戶在瀏覽器輸入 http://xyz.com 並點擊回車按鈕。

2

當用戶點擊回車按鈕,瀏覽器將頁面的請求經過網絡發送到 Web 服務器。

3

Web 服務器接收請求並解析請求信息。在 Web 服務器的配置文件中有配置當前項目根目錄路徑。因爲當前訪問的 URL 地址不包含子路徑,Web 服務器會查找配置文件的 index.php 文件。

4

Web 服務器將請求發送到項目的 public/index.php 文件。

5

PHP 解釋器接收到請求後,解釋執行 index.php 文件中的 PHP 代碼。此時,由 Componser 包管理器生成的自動加載文件被加載。

6

以後,Laravel 應用實例被實例化,同時,引導安裝 laravel 組件。

7

HTTP 或 Console 內核接收到 HTTP 請求,加載 Laravel 服務提供者,同時,將請求分發給路由器執行。

8

路由器將渲染視圖文件,並生成響應數據給 Web 服務器。

9

Web 服務器接收到 PHP 的輸出結果,並將結果返回給用戶瀏覽器。

10

用戶瀏覽器接收到服務器響應,渲染頁面並展示給用戶。

總結

經過理解 Laravel 請求生命週期,不只可以增長開發 Laravel 項目的自信心。還有助於調試項目、定位和解決 bug。在某些場景下能夠快加快速的更總問題。

原文:Request Life Cycle of Laravel

相關文章
相關標籤/搜索