天天看點

Laravel 5.5 底層原理:生命周期

簡介

當你了解了 Laravel 的工作原理,用起來才能遊刃有餘。

這篇文檔的目标就是從更高層面向你闡述 Laravel 架構的工作原理。通過對架構更全面的了解,你将會更加自信地建構應用。

如果你不能馬上了解所有的内容,不要失去信心!先試着掌握一些基本的東西,你的知識水準将會随着對文檔的探索而不斷提升。

生命周期概覽

請求的入口檔案

Laravel 應用的所有請求入口都是 public/index.php 檔案,所有請求都會被 web 伺服器(Apache/Nginx)導向這個檔案。

index.php 檔案包含的代碼并不多,但它是加載架構其它部分的起點。

<?php

define('LARAVEL_START', microtime(true));

// Register The Auto Loader
require __DIR__.'/../vendor/autoload.php';

// 建立 Laravel 應用執行個體(建服務容器執行個體)
$app = require_once __DIR__.'/../bootstrap/app.php';

// 運作應用,通過 kernel 處理請求并給出響應

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response)
           

在 index.php 檔案中載入 Composer 生成的自動加載設定,然後從 bootstrap/app.php 擷取 Laravel 應用執行個體。

應用的引導檔案

bootstrap/app.php 引導檔案的作用是:

  • 建立 app 服務容器執行個體
  • 在服務容器上注冊(綁定)Laravel 架構的核心接口
  • 傳回服務容器
<?php

// 建立服務容器
$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

// 綁定(注冊)接口到服務容器

// 綁定 App\Http\Kernel,用于處理 web 請求
$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);

// 綁定 App\Console\Kernel,用于處理 CLI 請求
$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

// 綁定 App\Exceptions\Handler,用于處理異常
$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

// 傳回服務容器
return $app;

           

Laravel 的第一個動作就是建立 app 服務容器執行個體。

HTTP/Console 核心

接下來,請求被發送到 HTTP 核心或 Console 核心(分别用于處理 Web 請求和 Artisan 指令),這取決于進入應用的請求類型。

這兩個核心是所有請求都要經過的中央處理器,現在,讓我們聚焦在位于 app/Http/Kernel.php 的 HTTP 核心。

HTTP 核心繼承自 Illuminate\Foundation\Http\Kernel 類,該類定義了一個 bootstrappers 數組,這個數組中的類在請求被執行前運作,這些 bootstrappers 配置了錯誤處理、日志、檢測應用環境以及其它在請求被處理前需要執行的任務。

HTTP 核心還定義了一系列所有請求在處理前需要經過的 HTTP 中間件,這些中間件處理 HTTP 會話的讀寫、判斷應用是否處于維護模式、驗證 CSRF 令牌等等。

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

服務提供者

核心啟動過程中最重要的動作之一就是為應用載入服務提供者。

應用的所有服務提供者都配置在 config/app.php 配置檔案的 providers 數組中。

首先,所有提供者的 register 方法被調用,然後,所有提供者被注冊之後,boot 方法被調用。

服務提供者負責啟動架構的所有各種各樣的元件,比如資料庫、隊列、驗證器,以及路由元件等,正是因為他們啟動并配置了架構提供的所有特性,是以服務提供者是整個 Laravel 啟動過程中最重要的部分。

分發請求

一旦應用被啟動并且所有的服務提供者被注冊,Request 将會被交給路由器進行分發,路由器将會分發請求到路由或控制器,同時運作所有路由指定的中間件。

聚焦服務提供者

服務提供者是啟動 Laravel 應用中最關鍵的部分,應用執行個體被建立後,服務提供者被注冊,請求被交給啟動後的應用進行處理,整個過程就是這麼簡單!

應用預設的服務提供者存放在 app/Providers 目錄下。

對 Laravel 應用如何通過服務提供者建構和啟動有一個牢固的掌握非常有價值。

預設情況下,AppServiceProvider 是空的,這裡是添加自定義啟動和服務容器綁定的最佳位置,當然,對大型應用,你可能希望建立多個服務提供者,每一個都有着更加細粒度的啟動。