laravel是一款流行的php開源框架,它的啟動過程與其他框架類似,都需要經歷一定的準備工作。本文將針對laravel的啟動過程進行詳細介紹。
一、入口文件index.php
Laravel的入口文件是index.php,所有請求都將通過這個文件進入框架。在index.php中,我們可以看到以下代碼段:
/* |-------------------------------------------------------------------------- | Turn On The Lights |-------------------------------------------------------------------------- | | We need to illuminate PHP development, so let us turn on the lights. | This bootstraps the framework and gets it ready for use, then it | will load up this application so that we can run it and send | the responses back to the browser and delight our users. | */ $app = require_once __DIR__.'/../bootstrap/app.php';
這段注釋解釋了代碼的作用,也可以看到require_once引入了bootstrap/app.php這個文件,也就是Laravel的啟動文件。
二、啟動文件bootstrap/app.php
在app.php文件中,我們可以主要看到三個關鍵類的實例化:$app、$kernel、$router。下面我們來逐一介紹。
- $app
$app是IlluminateFoundationApplication類的實例,是整個框架的核心,它管理了 Laravel 應用程序的容器并提供了許多強有力的功能,如路由、請求處理、事件、Cookie、Session、異常處理等等。接下來我們先看一下$app如何初始化。
在$app的構造函數中,它首先繼承了IlluminateContainerContainer類,生成了一個容器實例。在這個容器實例中我們可以綁定和注入我們需要的服務。
接著,它會注冊Laravel的所有核心容器服務,如路由、日志、視圖等。
最后,它會加載Laravel配置文件,這些配置文件存放在config目錄下,并將其放入$app實例的屬性中。
- $kernel
$kernel是IlluminateContractshttpKernel接口的一個實例,它是Laravel的HTTP內核,負責處理所有的HTTP請求,是連接請求和響應的橋梁。$kernel的主要作用是調用請求的中間件,并將請求傳遞給路由器,最后將響應傳遞給客戶端。
在$app實例化后,它會調用$app->make()方法然后通過容器解析獲取$kernel的實例。在這個過程中,$app的容器會解析$config[‘app’][‘middleware’]配置并注冊中間件,然后將中間件存儲到$kernel的實例中。
- $router
$router是IlluminateRoutingRouter類的實例,它是Laravel的路由器,處理所有的路由解析和分發。$router的主要作用是將請求和相應的操作進行匹配,為請求將被處理的路由存儲在請求實例的屬性中。
在$app實例化后,它會使用相應的配置生成路由器實例,并通過$app實例的instance方法注冊到Laravel的容器中。
此外,還需要提到的是,$app會將請求實例及其它相關實例綁定到容器中,以供中間件、路由和控制器使用。容器綁定完成后,Laravel就完成了準備工作。
三、調度請求
在Laravel中,請求的調度流程如下:
1.從客戶端發起HTTP請求。
2.請求首先經過Laravel的public/index.php文件,并被轉發到bootstrap/app.php文件中。
3.在bootstrap/app.php文件中,Laravel生成$app、$kernel和$router的實例,并將請求實例綁定到容器中。然后$app會調用$kernel的handle方法處理請求。
4.在$kernel的handle方法中,Laravel通過容器解析并依次調用注冊的中間件,然后將請求轉發給路由器。
5.在路由器中,Laravel從請求中提取URI,然后將其與路由器實例中定義的所有路由進行匹配。如果找到匹配的路由,Laravel就將控制權傳遞給相應的控制器。
6.控制器是請求的主要處理程序,它會調用業務邏輯代碼處理請求,并最終將結果作為響應返回給客戶端。
7.如果路由器沒有找到匹配的路由,它會將請求傳遞給錯誤處理程序。
8.在錯誤處理程序中,Laravel會根據錯誤的類型和配置,生成相應的響應返回給客戶端。