Laravel 原始碼筆記 2 App 服務容器

php_yt發表於2020-03-01
index.php
...
// 例項化服務容器
$app = require_once __DIR__.'/../bootstrap/app.php';

laravel重要概念:服務容器、服務、服務提供者。

服務容器,可以理解為我們的電腦,它裝載了各種軟體。

laravel 核心服務(框架執行所必須的服務)會被例項化,好比電腦執行所必須的軟體。

而其他服務僅僅是註冊到服務容器中,需要時才會被例項化,好比QQ、微信它只是待在硬碟裡,不用的時候它是不執行的,但是它們已經被註冊到電腦中。

服務提供者,服務是如何註冊到服務容器中的呢?是服務提供者(provider)提供的。這相當於軟體的安裝程式,新增到電腦的登錄檔中。
rZmqg7Nbr6.png!large

研究原始碼,必須明白什麼是契約。

契約的產生,是為了規範,同時也是為了解耦。

這裡我們把 laravel 中服務的概念,比作視訊播放器。視訊播放器,是個抽象的概念,它基礎的功能是播放視訊。QQ播放器、暴風播放器..是視訊播放器的實現,必須實現它基礎的功能。

laravel 中 這種包含基礎功能的類便是抽象介面類(interface),實現類需要實現它(implements)。契約 = interface + implements

一個服務配合另外的服務,共同完成一個目的,服務與服務之間是獨立的,那麼這便是低耦合。但彼此之間必須建立一種約定,我所需要的服務是什麼樣的,否則我用不了。這個約定就是interface,我提供介面,你需要implements實現它。

契約貫穿了laravel原始碼,隨處可見,也是研究原始碼的入手點。

服務繫結

服務繫結的概念很好理解。前面講了服務容器相當於電腦,服務相當於軟體,服務提供者相當於軟體的安裝程式,契約相當於視訊播放器必須有播放功能,那麼服務繫結就相當於電腦的預設視訊播放器

你可以在電腦裡安裝了N個視訊播放器軟體,但如果開啟一個視訊的時候,預設軟體決定了用哪個去播放它。

以上便是下邊要介紹的 bootstrap/app.php的全部內容

bootstrap/app.php

第一句程式碼,例項化服務容器,這個過程好像電腦開機階段,這行程式碼具體幹了什麼,需要再列一篇。

|----------------------------------------------------
|建立應用容器
|----------------------------------------------------
|我們要做的第一件事是建立一個新的Laravel應用容器例項
|是Laravel的所有成分的“膠水”
|用於系統繫結所有不同部分的IoC容器。

$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

中間三行程式碼,服務繫結

|------------------------------------------------
|繫結重要介面
|------------------------------------------------
|接下來,我們需要將一些重要的介面繫結到容器中
|我們將能夠在需要的時候解析它們。
|核心程式處理來自web和CLI的對這個應用程式的傳入請求。
| singleton 單例

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,//http鍥約
    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 //實現類
);

這三個繫結的服務,便是app/應用目錄的三個核心類
F6qX5EyiEH.png!large

回頭再看 index.php 中建立服務容器後僅接著的一行程式碼

$app = require_once __DIR__.'/../bootstrap/app.php';
//$app->make();從容器中例項化Kernel核心契約類所繫結的核心實現類
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$app->make 並不會指定例項化哪個實現類。這步相當於電腦要播放一個視訊檔案,具體開啟哪個播放器,要看電腦設定的預設播放器是哪個。

上邊程式碼Illuminate\Contracts\Http\Kernel::class 繫結的是App\Http\Kernel::class ,所以$kernelApp\Http\Kernel.php 這個類。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章