文字總是沒有代碼簡明羡藐。這里只是將主要的類和流程進行記錄,類似于目錄或者地圖的功能刺彩,不至于面對一堆源碼的時候摸不到頭緒。具體的實現(xiàn)細節(jié)還是要看代碼。
核心概念
1创倔、 Container
做兩件事情嗡害。
- 綁定 bind()
將具體實現(xiàn)轉為閉包,然后和接口對應起來畦攘,放在數組bindings中保存霸妹。 - 解析 make()
查詢bindings,將接口的對應實現(xiàn)類找到知押,通過反射叹螟,將類實例化返回。通過ReflectionClass類實現(xiàn)台盯。
2罢绽、Application
繼承自Container,主要提供下面3個方法静盅。
- bootstrap() 啟動
依次調用7個Bootstrapper進行啟動良价。 - register() 注冊ServiceProvider
調用ServiceProvider的register()方法。 - boot()
將App的狀態(tài)設為已經啟動蒿叠,調用ServiceProvider的boot()方法明垢。
3、ServiceProvider
所有的功能都是以服務形式進行提供市咽,例如:認證痊银、權限、緩存魂务、路由等曼验。需要提供register()方法向Application注冊,可提供boot()方法在Application啟動后調用粘姜。
4鬓照、Contract
一堆接口,當你不知道一個類的主要作用的時候孤紧,可以看看其實現(xiàn)的接口豺裆。
5、Facade
給類起一個別名号显,方便調用臭猜。(ps:純屬增加復雜度,我更喜歡邏輯上的簡單押蚤,不喜歡這種少打幾個字母的方便)
6蔑歌、 Bootstrapper
啟動器,App也就是框架啟動的過程揽碘。
一次請求的過程
// 初始化App次屠,并啟動
$app = new Application();
// 處理請求的核心類园匹,關聯(lián)路由
$kernel = new Kernel($app,$router);
// 將$_GET,$_POST等封裝到$request里
$request = Request::capture();
// 根據路由找到對應函數處理請求,生成相應
$response = $kernel->handle($request);
$response->send(); // 發(fā)送響應
$kernel->terminate(); // 善后
Application的啟動流程
首先劫灶,App初始化
- registerBaseBindings()
- registerBaseServiceProviders()
- registerCoreContainerAliases()
App啟動裸违,依次調用以下bootstrapper的bootstrap()方法,等到BootProviders啟動后本昏,依次再調用bootstrapper的boot()方法供汛。
- DetectEnvironment 檢測環(huán)境
- LoadConfiguration 加載設置
- ConfigureLogging 設置日志
- HandleExceptions 捕獲異常
- RegisterFacades 注冊Facade
- RegisterProviders 注冊ServiceProvider
- BootProviders 啟動ServiceProvider
下面重點分析后三個Bootstrapper
RegisterFacades()
將config/app.php
中的別名aliases進行注冊。
通過spl_autoload_register
注冊自動加載器涌穆,class_alias
方法注冊別名怔昨。
通過注冊別名,可以直接使用例如Route::get()
蒲犬,Cache::get()
之類的方法朱监,類加載器會自動找到對應的類的方法。
RegisterProviders()
將config/app.php
中的providers進行注冊原叮。ProviderRepository
會讀取配置文件中的ServiceProvider,并會編譯一份做為緩存巡蘸,然后向App注冊奋隶。
BootProviders()
調用各provider的boot()方法。
如何處理請求
路由是由RouteServiceProvider
進行提供悦荒,在App啟動的過程中會調用Http/routes.php
文件唯欣,將路由放入RouteCollection
中。當有一個請求到來的時候Kernel
會匹配到對應的路由搬味,然后調用相應的Controller
或者函數進行處理境氢。Controller
會渲染模板或者其他的HTTP響應。
具體的框架核心部分也就這么多了碰纬。剩下的就是每個服務組件的實現(xiàn)細節(jié)問題了萍聊。