搜尋
首頁php框架Laravel聊聊laravel中的Service Container

聊聊laravel中的Service Container

Jul 26, 2021 pm 03:53 PM
laravelphp依賴注入

什麼是Service Container

The Laravel service container is a powerful tool for managing class dependencies and performing dependency injection.

從Laravel官方文件對於Service Container的解釋可以看出,它的作用就是幫助我們管理和進行依賴注入的。

為什麼要用Service Container

在《依賴注入》中,我們看到使用依賴注入可以極大的降低程式碼的耦合度,但是也帶來了一個缺點,就是需要自己管理注入的對象。
如果一個元件有很多依賴,我們需要創建多個參數的setter方法來傳遞依賴關係,或者建立一個多個參數的建構函數來傳遞它們,另外在使用元件前還要每次都創建依賴,這讓我們的程式碼像這樣不易維護。
所以為依賴實例提供一個容器(Service Container),就是一個實用且優雅的方法。
例如下面是laravel的入口檔案(已去掉註解):

// public/index.php
<?php require __DIR__.&#39;/../bootstrap/autoload.php&#39;;

$app = require_once __DIR__.&#39;/../bootstrap/app.php&#39;;

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

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

$response->send();

$kernel->terminate($request, $response);
// bootstrap/app.php
<?php $app = new Illuminate\Foundation\Application(
    realpath(__DIR__.&#39;/../&#39;)
);

$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;

首先看bootstrap/app.php,其中$app Illuminate\Foundation\Application的一個實例,而Illuminate\Foundation\Application類別繼承自Container,所以$app其實就是一個Service Container。
然後下面的三個singleton方法定義了當依賴Illuminate\Contracts\Http\KernelIlluminate\Contracts\Console\KernelIlluminate\Contracts\Debug \ExceptionHandler這三個介面時,注入哪個類別的單例。
然後看public/index.php,其中的make方法其實就是用Service Container來new一個Illuminate\Contracts\Http\Kernel實例,跟普通new的差別就是會把他的依賴自動注入進去。

是不是很簡潔?

其實不單是Laravel,像是Yii2、Phalcon等框架都透過實作容器來管理依賴注入。

如何使用Service Container

既然是一個容器,無非就是兩個事,往裡面放東西和往外取東西,對應到Service Container就是綁定(Binding)和解析(Resolving )。

取得容器

在Laravel的Service Provider中,可以透過$this->app取得容器,除此之外,還可以使用app ()來取得容器。
如果在Laravel外使用Service Container,直接new一個Illuminate\Container\Container就可以獲得容器了。

以下都用$container代表取得到的容器。

綁定

  • 綁定傳回介面的實例

#
//使用闭包
$container->bind('BarInterface', function(){
    return new Bar();
});
//或者使用字符串
$container->bind('FooInterface', 'Foo');
  • ##綁定單例

singletion 方法綁定一個只會被解析一次的類別或介面到容器中,且後面的呼叫都會從容器中傳回相同的實例:

$container->singleton('BarInterface', function(){
    return new Bar();
});
  • 綁定實例

你也可以使用instance 方法,將一個已經存在的物件實例綁定到容器中。後面的呼叫都會從容器中回傳指定的實例:

$bar = new Bar();
$bar->setSomething(new Something);

$container->instance('Bar', $bar);
  • 情境綁定

有時候,你可能有兩個類別使用到相同接口,但你希望每個類別都能注入不同實作。

$container->when('Man')
          ->needs('PartnerInterface')
          ->give('Woman');
$container->when('Woman')
          ->needs('PartnerInterface')
          ->give('Man');
  • 標記

#有些時候,可能需要解析某個「分類」下的所有綁定。

$container->bind('Father', function () {
    //
});
$container->bind('Mother', function () {
    //
});
$container->bind('Daughter', function () {
    //
});
$container->bind('Son', function () {
    //
});
$container->tag(['Father', 'Mother', 'Daughter', 'Son'], 'familyMembers');

$container->bind('Family', function ($container) {
    return new Family($container->tagged('familyMembers'));
});
解析

  • make方法

  • #
$foo = $container->make('Foo');
  • 陣列方法

##
$bar = $container['Bar'];
  • 解析被標記綁定

$familyMembers = $container->tagged('familyMembers');

foreach ($familyMembers as $inpidual) {
    $inpidual->doSomething();
}

解析事件

每當服務容器解析一個物件時就會觸發事件。你可以使用 resolving 方法監聽這個事件。

$container->resolving(function ($object, $container) {
    // 当容器解析任何类型的对象时会被调用...
});

$container->resolving('Foo', function (Foo $foo, $container) {
    // 当容器解析「Foo」类型的对象时会被调用...
});

相關推薦:最新的五個Laravel影片教學

以上是聊聊laravel中的Service Container的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除
包容的幻想:解決偏遠工作中的孤立和孤獨感包容的幻想:解決偏遠工作中的孤立和孤獨感Apr 25, 2025 am 12:28 AM

Tocombatisolationandlonelinessinremotework,companiesshouldimplementregular,meaningfulinteractions,provideequalgrowthopportunities,andusetechnologyeffectively.1)Fostergenuineconnectionsthroughvirtualcoffeebreaksandpersonalsharing.2)Ensureremoteworkers

Laravel用於全堆棧開發:綜合指南Laravel用於全堆棧開發:綜合指南Apr 25, 2025 am 12:27 AM

laravelispularfullull-stackDevelopmentBecapeitOffersAsAseAseAseAseBlendOfbackendEdpoperandPowerandForterFlexibility.1)ITSbackEndCapaPabilities,sightifyDatabaseInteractions.2)thebladeTemplatingEngingEngineAllolowsLows

視頻會議攤牌:為遠程會議選擇正確的平台視頻會議攤牌:為遠程會議選擇正確的平台Apr 25, 2025 am 12:26 AM

選擇視頻會議平台的關鍵因素包括用戶界面、安全性和功能。 1)用戶界面應直觀,如Zoom。 2)安全性需重視,MicrosoftTeams提供端到端加密。 3)功能需匹配需求,GoogleMeet適合簡短會議,CiscoWebex提供高級協作工具。

哪些數據庫版本與最新的Laravel兼容?哪些數據庫版本與最新的Laravel兼容?Apr 25, 2025 am 12:25 AM

最新版本的Laravel10與MySQL5.7及以上、PostgreSQL9.6及以上、SQLite3.8.8及以上、SQLServer2017及以上兼容。這些版本選擇是因為它們支持Laravel的ORM功能,如MySQL5.7的JSON數據類型,提升了查詢和存儲效率。

將Laravel用作全棧框架的好處將Laravel用作全棧框架的好處Apr 25, 2025 am 12:24 AM

Laravelisanexcellentchoiceforfull-stackdevelopmentduetoitsrobustfeaturesandeaseofuse.1)ItsimplifiescomplextaskswithitsmodernPHPsyntaxandtoolslikeBladeforfront-endandEloquentORMforback-end.2)Laravel'secosystem,includingLaravelMixandArtisan,enhancespro

Laravel的最新版本是什麼?Laravel的最新版本是什麼?Apr 24, 2025 pm 05:17 PM

Laravel10,releasedonFebruary7,2023,isthelatestversion.Itfeatures:1)Improvederrorhandlingwithanewreportmethodintheexceptionhandler,2)EnhancedsupportforPHP8.1featureslikeenums,and3)AnewLaravel\Promptspackageforinteractivecommand-lineprompts.

最新的Laravel版本如何簡化開發?最新的Laravel版本如何簡化開發?Apr 24, 2025 pm 05:01 PM

thelatestlaravelververversionenhancesdevelopmentwith:1)簡化的inimpliticmodelbinding,2)增強EnhancedeloquentcapabibilitionswithNewqueryMethods和3)改善了supportorfortormodernphpfortornphpforternphpfeatureserslikenamedargenamedArgonedArgonsemandArgoctess,makecodingMoreftermeforefterMealiteFficeAndEnjoyaigaigaigaigaigaiganigaborabilyaboipaigyAndenjoyaigobyabory。

在哪裡可以找到最新的Laravel版本的發行說明?在哪裡可以找到最新的Laravel版本的發行說明?Apr 24, 2025 pm 04:53 PM

你可以在laravel.com/docs找到最新Laravel版本的發布說明。 1)發布說明提供了新功能、錯誤修復和改進的詳細信息。 2)它們包含示例和解釋,幫助理解新功能的應用。 3)注意新功能的潛在復雜性和向後兼容性問題。 4)定期審查發布說明可以保持更新並激發創新。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器