Laravel框架原始碼解析
一、請求-響應篇
1.程式啟動準備
1.1 服務容器例項化
index.php
入口檔案包含了$app = require_once __DIR__.'/../bootstrap/app.php';
這一行程式碼,app.php
會返回框架的建立的服務容器。這個過程會完成以下幾個步驟:
- 服務容器例項化
- 註冊服務容器本身
- 註冊基礎服務提供者
- 基礎路徑註冊
- 核心類別名註冊
相關原始碼在Illuminate\Foundation
目錄下的Application.php
檔案中。(注:使用的laravel版本:5.1;文中的Illuminate位於 根目錄\vendor\laravel\framework\src\ 目錄下,為了行文方便,故省略。)
1.2 核心類(Kernel)例項化
在容器例項化之後,便可以通過服務容器自動例項化物件,例項化程式碼在index.php
中的 $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
。
2.請求例項化
完成了第一步的準備工作之後,需要進行請求的例項化,請求例項的建立是通過Illuminate\Http\Request
類的capture
方法完成的。
3.處理請求
完成請求例項化之後,將進入對請求例項的處理階段,即$response = $kernel->handle();
通過不同的處理方式可以返回不同的響應結果,從而實現不同的功能。具體請求的處理是通過Kernel.php中的sendRequestThroughRouter方法實現的。
3.1請求處理準備工作
這個準備過程大致包含:環境監測、配置載入、日誌配置、異常處理、外觀註冊、服務提供者註冊、啟動服務 這7大步驟。在Illuminate\Foundation\Http\Kernel.php
中的$bootstrappers
屬性進行配置。對應類檔案在Illuminate\Foundation\Bootstrap目錄下。
3.2中介軟體
在請求處理中,經過煩瑣的準備工作,應用程式開始對請求進行處理,Laravel對請求的處理是逐級進行的,首先經過中介軟體處理,然後通過路由,最後控制器生成響應。
3.3路由處理生成響應
- 路由匹配
- 控制器生成
- 響應生成
4. 響應的傳送與程式終止
4.1響應的傳送
整個請求-響應過程最後的部分就是將封裝在Illuminate\Http\Response
例項中的響應以Http響應的形式傳送給客戶端,實現一個請求生命週期最後的環節。響應的傳送是通過index.php
中的$response->send();
實現的。
4.2程式終止
完成Http的響應後,進入程式生命週期的最後階段——程式終止,在Laravel框架中,程式終止主要是完成終止中介軟體的呼叫。通過index.php
中的terminate()
方法實現。
二、資料庫連線與管理篇
1.資料庫管理階段
首先介紹查詢構造器實現過程中的資料庫管理階段。查詢構造器建立的過程可分為2個階段:資料庫連線封裝階段、查詢構造器生成階段。其中第一階段又可分為以下四個過程:
- 資料庫管理階段
- 資料庫連線工廠階段
- 資料庫聯結器階段
- 資料庫連線建立階段