laravel框架基礎(2)---laravel專案載入機制
當我們,通過瀏覽器請求laravel的時候 laravel就會根據我們的請求連結來選擇對應的方法執行並返回我們所需要的實際結果。
那麼這個過程是怎樣的呢?
1.生命週期 2018-12-28 17:03:52[作者:struggler]
首先當我們通過訪問laravel的時候,這個時候就會進入public/index.php中。
在index.php中通過composer進行依賴管理,然後通過bootstrap/app.php來獲取我們所需要的Illuminate\Foundation\Application類也就是應用例項。
獲取到應用例項Application之後
通過send吧使用者執行的結果響應輸出,並停止在執行過程中所執行的中介軟體。
2.應用例項建立與基礎應用相關注冊 2018-12-28 17:03:52[作者:struggler]
bootstrap/app.php中application建立的時候會做到事情
不過這裡要注意Application是繼承與Illuminate\Container\Container
可以很明顯的發現首先會對於基礎的
應用繫結到容器中 registerBaseBindings
註冊所用的應用伺服器 registerBaseServiceProviders
註冊核心容器別名 registerCoreContainerAliases
其實這個過程還有一個就是設定程式的路徑
在registerBaseBindings 方法中首先我們會吧application設定為全域性共享。
在vendor\laravel\framework\src\Illuminate\Container\Container.php中
而這些例項就可以通過instance方法進行繫結
所在registerBaseBindings中就會先把我Application與Container事先繫結為共享例項。
而registerBaseServiceProviders則是對於基礎服務註冊主要是事件,日誌與路由
而在每一個服務中都通會通過register對於對應服務通過Container中的singleton繫結在Illuminate\Container\Container中的$bindings屬性中
當對應的基礎服務註冊之後就會把系統核心類庫別名註冊
然後返回Application例項,在bootstrap/app.php中把Http,Console異常核心類庫註冊
Application在初始化的時候對於laravel所需要核心類庫進行別名註冊,以及服務註冊
3.服務解析與Http中介軟體 2018-12-28 17:03:52[作者:struggler]
之前已經講解了index.php中的執行流程。那麼接下來簡單解釋服務於中介軟體中間的載入。
index.php中。當執行make方法的時候這個地方注意獲取到的是App\Http\Kernel類
這個時候就會執行到Application中的make方法 ,通過方法的跳轉跟蹤最終會執行到
vendor\laravel\framework\src\Illuminate\Container\Container.php 中的resolve 方法也就是容器解析的方法
在這個方法中
-
- 首先會先去獲取是否存在對應的別名 通過getAlias
- 然後檢查傳遞的例項是否有繫結
- 然後就會從$instances中獲取對應的共享例項,而如果沒有則會去解析
- 這個時候就會通過getConcrete獲取之前 通過Application中registerBaseServiceProviders方法註冊在Container->$bindings 中的服務
所以最終解析出App\Http\Kernel類 ,回到index.php中
因為Hernel是繼承與Illuminate\Foundation\Http\Kernel
所以我們開啟Illuminate\Foundation\Http\Kernel檢視handle方法
enableHttpMethodParameterOverride方法開啟方法引數覆蓋,既可以在POST請求中新增_method引數偽造HTTP方法
重點我們需要關注的是sendRequestThroughRouter
在這個方法中就是執行使用者的請求
我們可以看到在方法中呼叫了Pipeline
Pipeline是Laravel的管道操作類。而實際上中介軟體的實現的核心就是Pipeline。在這裡傳送一個$request物件通過middleware中介軟體陣列
而執行的中介軟體就在App\Http\Kernel中的$middleware定義好
所以在專案啟動的時候就會執行,這些中介軟體處理 HTTP 會話 讀寫、判斷應用是否處於維護模式、 驗證 CSRF 令牌 等等。
HTTP 核心的 handle 方法簽名相當簡單:獲取一個 Request ,返回一個 Response。以把該核心想象作一個代表整個應用的大黑盒子,輸入 HTTP 請求,返回 HTTP 響應。
最後返回出Response物件並輸出結果,終止中介軟體