laravel 應用層執行過程原始碼分析

www88jmpcom-17I76934555 發表於 2021-03-29

Laravel 是優雅的 PHP Web 開發框架。具有高效、簡潔、富於表達力等優點。採用 MVC 設計,是崇尚開發效率的全棧框架。是最受關注的 PHP 框架。

所以 laravel 框架本身的設計思想我認為值得我們每個 phper 去學習,這裡我通過一個手寫的簡易版框架去認識和了解 laravel 在應用層執行的過程。主要包含的內容有:容器、應用框架、核心、契約、入口檔案、服務提供者、路由、請求、門面、控制器及輔助函式。文章結尾附上執行流程的圖片供大家參考。

容器:執行依賴注入和管理依賴的工具

主要做了2件事情:

  • 【繫結】物件、例項(共享例項)、介面(介面到實現)、閉包4個抽象和具體類到容器陣列中

  • 【解析】已繫結的抽象(通過反射機制實現解析具體類中的依賴注入),即建立例項

整一個框架裡面就圍繞這個容器提供依賴的,所以相當於一個心臟,也是 laravel 的一個心臟。這裡貼出原始碼,後面就不貼了。

<?php

應用程式

主要也是做2件事:在建構函式中註冊基本繫結和註冊基本服務

  • 建構函式中【註冊基本繫結】到容器共享例項陣列中:繫結自身到app 抽象;繫結自身到從容器類抽象

  • 建構函式中【註冊基本服務】到容器繫結陣列中:包含但不限於:路由物件、請求物件、日誌契約介面到檔案日誌實現類、檔案日誌服務物件、mysql日誌服務物件…

核心

  • 核心類通過建構函式將依賴(應用框架(容器))注入

  • 並在建構函式中解析路由物件到核心的屬性中

  • 將請求物件傳入到路由物件(在建構函式中解析路由物件到核心的屬性中)的請求分發方法中

契約:契約是一組介面,每一個契約都有框架提供的相應的實現

容器契約

核心契約

服務提供者契約

  • 日誌契約

入口檔案

主要做了5件事,執行順序也是按照下面執行,當然可以調整,只不過為了更好理解我就這麼排了

  • 例項化應用框架

  • 通過路由門面類的靜態方法執行路由配置。具體執行流程檢視門面相應的內容即可

  • 繫結核心契約的介面到實現

  • 解析核心契約物件介面(即獲取實現契約介面的具體實現類的例項化物件)

  • 呼叫請求物件設定請求地址到請求物件的屬性中,並將請求物件返回的方法

  • 將請求物件傳入到核心的處理請求方法中

服務提供者

這裡主要介紹的是服務的概念。設計思路與 laravel 關於服務提供者實現的不一樣,對這塊感興趣的朋友可以看下原始碼或者留言一起討論。

  • 檔案日誌服務類:實現契約介面的約束方法

  • mysql 日誌服務類:實現契約介面的約束方法

路由物件

主要做了3件事

  • 將路由配置項新增到路由物件的路由表中

  • 請求分發方法執行查詢路由表的方法

  • 執行匹配到請求的路由,即執行控制器下的方法或者立即執行閉包。示例中介紹執行控制器的方法流程,這樣才更能掌握服務提供者和輔助函式的概念

請求物件

設定請求地址到請求物件的屬性中,並將請求物件返回

門面:通過定義門面的抽象類,「靜態代理」應用的服務容器中可用的底層類

門面的抽象類

  • 呼叫具體物件(路由、請求…)的門面類, 執行__callStatic() 魔術方法動態的呼叫靜態物件

  • 獲取繼承該抽象門面類的門面物件名稱

  • 通過獲取門面名稱從容器已繫結的類庫中解析出門面要靜態代理的基類,並返回

  • 傳入可變引數,並動態執行該具體物件的方法

控制器

執行控制器的方法的相應業務。

這裡示例提供有資料庫連線的服務,配合應用服務容器輔助函式並呼叫服務方法即可

輔助函式

應用服務容器輔助函式:根據引數判斷直接返回服務容器或者解析出相應抽象的例項

執行流程

執行的順序以 「阿拉伯數字.」 做為順序閱讀
文章來源:公眾號

本作品採用《CC 協議》,轉載必須註明作者和本文連結