1. 程式人生 > >laravel框架基礎(2)---laravel專案載入機制

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之後

,通過呼叫make方法解析出Http請求執行物件,然後呼叫handle方法執行使用者的 請求,並返回出response的例項

   

  通過send吧使用者執行的結果響應輸出,並停止在執行過程中所執行的中介軟體。

2.應用例項建立與基礎應用相關注冊 2018-12-28 17:03:52[作者:struggler]

  bootstrap/app.phpapplication建立的時候會做到事情

     

     不過這裡要注意Application是繼承與Illuminate\Container\Container

     

  

  可以很明顯的發現首先會對於基礎的

  應用繫結到容器中 registerBaseBindings

  註冊所用的應用伺服器 registerBaseServiceProviders

  註冊核心容器別名 registerCoreContainerAliases

  其實這個過程還有一個就是設定程式的路徑

   

  在registerBaseBindings 方法中首先我們會吧application設定為全域性共享

  在vendor\laravel\framework\src\Illuminate\Container\Container.php

$instances中繫結著laravel所需要的一些共享的例項

  而這些例項就可以通過instance方法進行繫結

  

  所在registerBaseBindings中就會先把我ApplicationContainer事先繫結為共享例項

  而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 方法也就是容器解析的方法

  

  在這個方法中

    1. 首先會先去獲取是否存在對應的別名 通過getAlias
    2. 然後檢查傳遞的例項是否有繫結
    3. 然後就會從$instances中獲取對應的共享例項而如果沒有則會去解析
    4. 這個時候就會通過getConcrete獲取之前 通過ApplicationregisterBaseServiceProviders方法註冊在Container->$bindings 中的服務

    所以最終解析出App\Http\Kernel ,回到index.php

  

  因為Hernel是繼承與Illuminate\Foundation\Http\Kernel

   

  所以我們開啟Illuminate\Foundation\Http\Kernel檢視handle方法

  

  enableHttpMethodParameterOverride方法開啟方法引數覆蓋,既可以在POST請求中新增_method引數偽造HTTP方法

  重點我們需要關注的是sendRequestThroughRouter

    

  在這個方法中就是執行使用者的請求

  我們可以看到在方法中呼叫了Pipeline

  PipelineLaravel的管道操作類。而實際上中介軟體的實現的核心就是Pipeline。在這裡傳送一個$request物件通過middleware中介軟體陣列

  而執行的中介軟體就在App\Http\Kernel中的$middleware定義好

  

  所以在專案啟動的時候就會執行,這些中介軟體處理 HTTP 會話 讀寫、判斷應用是否處於維護模式、 驗證 CSRF 令牌 等等。

  HTTP 核心的 handle 方法簽名相當簡單:獲取一個 Request ,返回一個 Response。以把該核心想象作一個代表整個應用的大黑盒子,輸入 HTTP 請求,返回 HTTP 響應。

  

  最後返回出Response物件並輸出結果終止中介軟體