Laravel生命週期

咱們都知道 PHP 有兩種運行模式,其實不光 PHP,全部的網絡編程語言都有這兩種運行模式php

  • 命令行界面(CLI)模式
  • WEB 服務器模式

人類社會的分工和協做歷來都沒有中止進化和演變,做爲人類的智慧的產物一樣隨着人類思想的進步和創造力的提高一步步發生着變化,人們把現實中的變化,逐步映射到了計算機系統中。laravel

PHP 是一種腳本語言,全部的變量只在一次請求中有效,下一次新的請求過來以後,全部的變量都已物是人非。因此當咱們說 PHP 的生命週期的時候,一般都會加上一個限定詞 「單次請求」, 全名就是PHP在單次網絡請求中的生命週期 ~web

image.png

1.使用Composer的自動加載功能,把全部須要使用的 PHP 文件添加到系統中以備調用  
  require \_\_DIR\_\_.'/../vendor/autoload.php';    
 2.建立 Laravel 單例應用實例  
  $app \= require\_once \_\_DIR\_\_.'/../bootstrap/app.php';  
  
 3.最關鍵的步驟,接受請求,對請求進行處理,返回請求處理的結果  
  $kernel \= $app\->make(Illuminate\\Contracts\\Http\\Kernel::class);  
  $response \= $kernel\->handle(  
      $request \= Illuminate\\Http\\Request::capture()  
 );  
  $response\->send();  
  
 4.請求結束,進行回調  
  $kernel\->terminate($request, $response);

Laravel 的建立過程:

image.png

1.  加載 Composer 生成的 autoload.php 自動加載文件
2. 建立 Laravel 應用容器對象 $app ( Service Container ) 編程

$app \= new Illuminate\\Foundation\\Application( dirname(\_\_DIR\_\_) );  
  $app\->singleton(  
      Illuminate\\Contracts\\Http\\Kernel::class,  
      App\\Http\\Kernel::class  
 );  
  $app\->singleton(  
      Illuminate\\Contracts\\Console\\Kernel::class,  
      App\\Console\\Kernel::class  
 );  
  $app\->singleton(  
      Illuminate\\Contracts\\Debug\\ExceptionHandler::class,  
      App\\Exceptions\\Handler::class  
 );  
 return $app;

在這裏基本也沒啥難以理解的東西,建立了 $app 容器對象,綁定了 HTTP Kernal 和 Console Kernel,分別用來處理 HTTP 網絡請求和 CLI 請求( 執行 php artisan 相關命令請求),還綁定了用來處理應用運行異常的調試處理器。bootstrap

3.  建立 Laravel HTTP Kernel 核心,接收用戶的網絡請求,處理並返回響應結果數組

我們終於又回來了,我們先來看看建立 Kernel 的時候都作了啥,HTTP 內核繼承自 Illuminate\Foundation\Http\Kernel 類,這個類中擁有三個核心成員變量。安全

protected $app;  
protected $router;  
protected $bootstrappers \= \[  
      \\Illuminate\\Foundation\\Bootstrap\\LoadEnvironmentVariables::class,     # 加載 .env 中的配置信息  
      \\Illuminate\\Foundation\\Bootstrap\\LoadConfiguration::class,                # 加載 config 目錄中全部配置文件的配置信息  
      \\Illuminate\\Foundation\\Bootstrap\\HandleExceptions::class,                 # 異常處理  
      \\Illuminate\\Foundation\\Bootstrap\\RegisterFacades::class,                # 註冊門面  
      \\Illuminate\\Foundation\\Bootstrap\\RegisterProviders::class,               # 註冊Service Providers  
      \\Illuminate\\Foundation\\Bootstrap\\BootProviders::class,                    # 註冊啓動器   
  \];

這三個核心成員變量就是引導我們更快理清 $app->kernel->handle(網絡請求) 的最好導遊:服務器

$app 我們已經說了足夠多,就是應用容器,咱們全部的工做都在這個容器中進行。網絡

$router 路由對象,它提供路由相關的服務,幫助咱們把網絡請求分配給對應的路由進行邏輯處理,而後把處理的結果(網絡響應)返回給咱們,咱們在web.php中定義的路由就是由它來管理的。app

$bootstrappers 數組,這個數組中的任務項在網絡請求被處理前運行,咱們能夠看到環境檢查,配置加載,異常處理,Facedes 門面註冊,ServiceProvider 註冊等等任務都須要在網絡請求被處理前被首先執行,並且這些任務是有先後順序的,排在前面的會首先執行,這也很容易理解,由於無論是 Facades 仍是 Service Providers 都是定義在 config 目錄中的 app.php 文件中的,只有加載來配置以後才能註冊門面和Service Providers。

而後我們再來看看 $app->kernel 的構造函數,在這裏我們看到了一個臉熟的不能再熟的老朋友 — Middleware ,在 Kernel 以及它的基類 Illuminate\Foundation\Http\Kernel 中定義了一系列的 middlewares ,藉助這些中間件,就能夠完成對用戶請求的過濾和安全檢查等等功能。

public function \_\_construct(Application $app, Router $router)  
 {      $this\->app \= $app;  
      $this\->router \= $router;  
  
      $router\->middlewarePriority \= $this\->middlewarePriority;  
      foreach ($this\->middlewareGroups as $key \=> $middleware) {  
          $router\->middlewareGroup($key, $middleware);  
 }  
    foreach ($this\->routeMiddleware as $key \=> $middleware) {  
          $router\->aliasMiddleware($key, $middleware);  
 } }

至此我們仍是終於能夠繞回來進入  $app->kernel->handle($request) 看一看它是如何處理網絡請求的吧,下面這張圖結合第一張圖會更清楚一些。

image.png

4.  結束請求,進行回調,終止 Laravel 應用,Laravel 到此也完成了它的歷史使命。中間件中有一類的中間件,terminable middleware 的處理邏輯就是在這個階段執行的。

參考文檔:laravel生命週期

相關文章
相關標籤/搜索