詳解及案例:Laravel請求的生命周期介紹

本篇文章給大家帶來了關于laravel請求聲明周期的相關知識,請求生命周期有不同的術語,如自動加載器、內核、服務提供器、調度請求和路由等,希望對大家有幫助。

詳解及案例:Laravel請求的生命周期介紹

laravel 是一個強大的php框架,當您學習laravel框架時,Laravel 請求生命周期是最好的起點。本文將介紹在Laravel中一個http 請求從接收到響應之間發生了什么。對請求生命周期的深入研究將有助于我們理解 Laravel 結構。(基于Laravel 8)

請求生命周期有不同的術語,如自動加載器、內核、服務提供器、調度請求和路由等。一旦您詳細了解了所有術語,您將對該框架有更多的理解,并且可以隨心所欲地擴展不同的功能。

詳解及案例:Laravel請求的生命周期介紹

Laravel 請求生命周期概述

第一步

加載項目依賴,創建 Laravel 應用實例

Laravel 應用程序的所有請求的入口點都是 public/index.php 文件。所有請求都由你的 web 服務器(apache/nginx)配置定向到此文件。那個 index.php 文件不包含太多代碼。相反,它是加載框架其余部分的起點。

# 1、加載項目依賴require __DIR__.'/../vendor/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php';

該 index.php 文件將加載 composer 生成的自動加載器定義,然后從 bootstrap/app.php 中檢索 Laravel 應用程序的實例。

bootstrap/app.php:

<?php      # 2、創建應用實例     $app = new IlluminateFoundationApplication(         $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)     );      # 3、完成內核綁定     $app->singleton(         IlluminateContractsHttpKernel::class,         AppHttpKernel::class     );      $app->singleton(         IlluminateContractsconsoleKernel::class,         AppConsoleKernel::class     );      $app->singleton(         IlluminateContractsDebugExceptionHandler::class,         AppExceptionsHandler::class     );      return $app;

之后,它將引導 Laravel 框架使用并生成應用程序實例。

public/index.php:

# 4、接收請求并響應$kernel = $app->make(Kernel::class);// 處理請求$response = tap($kernel->handle( 	// 創建請求實例     $request = Request::capture()// 發送響應))->send();$kernel->terminate($request, $response);

一旦應用程序實例生成,傳入請求將由內核處理。

HTTP 或 Console 內核

接下來,傳入請求被發送到 HTTP 內核還是 Console 內核,具體取決于進入應用的請求類型。這兩個內核充當所有請求流經的中心位置。現在,讓我們只關注 HTTP 內核,它位于 app/Http/Kernel.php 中。

HTTP 內核擴展了 IlluminateFoundationHttpkernel 類,該類定義了一個將在執行請求之前運行的 bootstrappers 數組。這些引導程序用來配置異常處理、配置日志、檢測應用程序環境 ,并執行在實際處理請求之前需要完成的其他任務。通常情況下,你不需要在意這些配置。

HTTP 內核還定義了一個 HTTP 中間件列表,所有請求在被應用程序處理之前必須通過這些中間件。這些中間件處理 HTTP 會話的讀寫、確定應用程序是否處于維護模式、驗證 csrf 令牌等。我們接下來會做詳細的討論。

HTTP 內核的 handle 方法的簽名非常簡單:它接收 Request 接口并返回 Response 接口。把內核想象成一個代表整個應用程序的大黑匣子。向它提供 HTTP 請求,它將返回 HTTP 響應。

通過配置中間件和其他功能,HTTP 內核還加載服務提供者。

服務提供器

最重要的內核引導操作之一是為應用程序加載 service providers。應用程序的所有服務提供程序都在 config/app.php 中的 providers 數組。

Laravel 將遍歷這個提供者列表并實例化它們中的每一個。實例化提供程序后,將對所有提供程序調用 register方法。然后,一旦注冊了所有提供程序,就會對每個提供程序調用boot 方法。

服務提供者負責引導框架的所有不同組件,如數據庫、隊列、驗證和路由組件。基本上,Laravel 提供的每個主要功能都是由服務提供商引導和配置的。由于它們引導和配置框架提供的許多特性,服務提供者是整個 Laravel 引導過程中最重要的部分。

您可能想知道,為什么在對任何服務提供者調用 boot方法之前都要調用每個服務提供者的 register 方法。答案很簡單。通過首先調用每個服務提供程序的 register 方法,服務提供者可能依賴于在執行 boot 方法時注冊并可用的每個容器綁定。

服務提供者是引導 Laravel 應用程序的關鍵。應用程序實例被創建,服務提供者被注冊,請求被交給引導的應用程序。真的就是這么簡單!

牢牢掌握 Laravel 應用程序如何通過服務提供商構建和引導是非常有價值的。您的應用程序的默認服務提供者存儲在該app/Providers目錄中。

默認情況下,AppServiceProvider是空的。此程序是添加應用程序自己的引導和服務容器綁定的好地方。對于大型應用程序,您可能希望創建多個服務提供者,每個服務提供者為您的應用程序使用的特定服務提供更精細的引導。

一旦應用程序被引導并且所有服務提供者都被注冊和引導,請求將被移交給路由器進行調度。

路由

應用程序中最重要的服務提供者之一是 AppProvidersRouteServiceProvider。此服務提供程序加載應用程序的 routes 目錄中包含的路由文件。

路由器將請求發送到路由或控制器,并運行任何路由特定的中間件。

中間件為過濾或檢查進入應用程序的 HTTP 請求提供了一種方便的機制。例如,Laravel 包含一個這樣的中間件,用于驗證應用程序的用戶是否經過身份驗證。如果用戶未通過身份驗證,中間件將用戶重定向到登錄頁。但是,如果用戶經過身份驗證,中間件將允許請求進一步進入應用程序。一些中間件被分配給應用程序中的所有路由,比如那些在 HTTP 內核的 $middleware屬性中定義的路由,而一些只被分配給特定的路由或路由組。您可以通過閱讀完整的 中間件 文檔來了解更多關于中間件的信息。

如果請求通過了所有匹配路由分配的中間件,則將 HTTP 請求定向到控制器或通過省略控制器直接返回視圖或響應

控制器

控制器 app/Http/Controllers/ 執行特定操作并將數據發送到視圖。

視圖

視圖 resources/views/ 適當地格式化數據,提供 HTTP 響應。

最后

一旦路由或控制器方法返回一個響應,該響應將通過路由的中間件返回,從而使應用程序有機會修改或檢查傳出的響應。

通常,不會只從路由操作中返回簡單的字符串或數組。而是返回完整的 IlluminateHttpResponse 實例或視圖。

Response 實例派生自 symfonyComponentHttpFoundationResponse 類,它提供了許多構造 HTTP 響應的方法。

最后,一旦響應通過中間件傳回,HTTP 內核的 handle 方法將返回響應對象,并且index.php文件對返回的響應調用 send 方法。send 方法將響應內容發送到用戶的 web 瀏覽器。

至此,我們已經完成了整個 Laravel 請求生命周期的所有步驟!

【相關推薦:laravel

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享