以下由Laravel教學專欄帶大家初步了解Laravel中的生命週期,希望對需要的朋友有幫助!
以下是public\index.php的全部原始碼,更具體來說可以分為四個步驟:
1. require __DIR__.'/../bootstrap/autoload.php'; 2. $app = require_once __DIR__.'/../bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 3. $response = $kernel->handle( $request = Illuminate\Http\Request::capture() ); $response->send(); 4. $kernel->terminate($request, $response);
以下是四步驟詳細的解釋是: composer自動載入需要的類別
檔案載入composer產生的自動載入設置,包括所有你 composer require的依賴。
產生容器Container,Application實例,並向容器註冊核心元件(HttpKernel,ConsoleKernel ,ExceptionHandler)(對應程式碼2,容器很重要,後面詳細講解)。
處理請求,產生並發送回應(對應程式碼3,毫不誇張的說,你99%的程式碼都運行在這個小小的handle 方法裡面)。
請求結束,進行回呼(對應程式碼4,還記得可終止中間件嗎?沒錯,就是在這裡回呼的)。
我們不妨在詳細一點:
第一步:註冊載入composer自動產生的class loader 就是載入初始化第三方依賴。
第二步:產生容器 Container 並向容器註冊核心元件,是從 bootstrap/app.php 腳本取得 Laravel 應用實例,
#第三步:這一步是重點,處理請求,並產生發送回應。 請求被傳送到 HTTP 內核或 Console 內核,這取決於進入應用程式的請求類型。
取決於是透過瀏覽器請求還是透過控制台請求。這裡我們主要是透過瀏覽器請求。 HTTP 核心的標誌性方法 handle處理的邏輯相當簡單:取得一個 Request,傳回一個 Response,把該核心想像作一個代表整個應用程式的大黑盒子,輸入 HTTP 請求,回傳 HTTP 回應。HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。
protected $bootstrappers = [ //注册系统环境配置 (.env) 'Illuminate\Foundation\Bootstrap\DetectEnvironment', //注册系统配置(config) 'Illuminate\Foundation\Bootstrap\LoadConfiguration', //注册日志配置 'Illuminate\Foundation\Bootstrap\ConfigureLogging', //注册异常处理 'Illuminate\Foundation\Bootstrap\HandleExceptions', //注册服务容器的门面,Facade 是个提供从容器访问对象的类。 'Illuminate\Foundation\Bootstrap\RegisterFacades', //注册服务提供者 'Illuminate\Foundation\Bootstrap\RegisterProviders', //注册服务提供者 `boot` 'Illuminate\Foundation\Bootstrap\BootProviders', ];
注意顺序:
Facades 先于ServiceProviders,Facades也是重点,后面说,这里简单提一下,注册 Facades 就是注册 config\app.php中的aliases 数组,你使用的很多类,如Auth,Cache,DB等等都是Facades;而ServiceProviders的register方法永远先于boot方法执行,以免产生boot方法依赖某个实例而该实例还未注册的现象。HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。
在Laravel基础的服务启动之后,就要把请求传递给路由了。路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。
传递方式: 传递给路由是通过 Pipeline(管道)来传递的,但是Pipeline有一堵墙,在传递给路由之前所有请求都要经过,这堵墙定义在app\Http\Kernel.php中的$middleware数组中,没错就是中间件,默认只有一个CheckForMaintenanceMode中间件,用来检测你的网站是否暂时关闭。这是一个全局中间件,所有请求都要经过,你也可以添加自己的全局中间件。
然后遍历所有注册的路由,找到最先符合的第一个路由,
经过该路由中间件,进入到控制器或者闭包函数,执行你的具体逻辑代码。
所以,当请求到达你写的代码之前,Laravel已经做了大量工作,请求也经过了千难万险,那些不符合或者恶意的的请求已被Laravel隔离在外。
原文地址:https://juejin.cn/post/6992208648575385607
作者:卡二条
相关推荐:最新的五个Laravel视频教程
以上是初步了解Laravel中的生命週期的詳細內容。更多資訊請關注PHP中文網其他相關文章!