laravel中的ServiceContainer的概念及使用方法

這篇文章主要講解了“l(fā)aravel中的Service Container的概念及使用方法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“l(fā)aravel中的Service Container的概念及使用方法”吧!

創(chuàng)新新互聯(lián),憑借十余年的做網(wǎng)站、成都網(wǎng)站建設(shè)經(jīng)驗,本著真心·誠心服務(wù)的企業(yè)理念服務(wù)于成都中小企業(yè)設(shè)計網(wǎng)站有上1000家案例。做網(wǎng)站建設(shè),選創(chuàng)新互聯(lián)建站。

什么是Service Container

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

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

為什么要用Service Container

在《依賴注入》中,我們看到使用依賴注入可以極大的降低代碼的耦合度,但是也帶來了一個缺點,就是需要自己管理注入的對象。
如果一個組件有很多依賴,我們需要創(chuàng)建多個參數(shù)的setter方法來傳遞依賴關(guān)系,或者建立一個多個參數(shù)的構(gòu)造函數(shù)來傳遞它們,另外在使用組件前還要每次都創(chuàng)建依賴,這讓我們的代碼像這樣不易維護。
所以為依賴實例提供一個容器(Service Container),就是一個實用而且優(yōu)雅的方法。
比如下面是laravel的入口文件(已去掉注釋):

// public/index.php
<?php

require __DIR__.'/../bootstrap/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

$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__.'/../')
);

$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,其中$appIlluminate\Foundation\Application的一個實例,而Illuminate\Foundation\Application類繼承自Container,所以$app實際上就是一個Service Container。
然后下面的三個singleton方法定義了當(dāng)依賴Illuminate\Contracts\Http\Kernel、Illuminate\Contracts\Console\Kernel、Illuminate\Contracts\Debug\ExceptionHandler這三個接口時,注入哪個類的單例。
然后看public/index.php,其中的make方法實際上就是用Service Container來new一個Illuminate\Contracts\Http\Kernel實例,跟普通new的區(qū)別就是會把他的依賴自動注入進去。

是不是很簡潔?

其實不單是Laravel,像Yii2、Phalcon等框架都通過實現(xiàn)容器來管理依賴注入。

如何使用Service Container

既然是一個容器,無非就是兩個事,往里放東西和往外取東西,對應(yīng)到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 方法綁定一個只會被解析一次的類或接口至容器中,且后面的調(diào)用都會從容器中返回相同的實例:

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

你也可以使用 instance 方法,綁定一個已經(jīng)存在的對象實例至容器中。后面的調(diào)用都會從容器中返回指定的實例:

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

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

有時候,你可能有兩個類使用到相同接口,但你希望每個類都能注入不同實現(xiàn)。

$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');
  • 數(shù)組方法

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

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

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

解析事件

每當(dāng)服務(wù)容器解析一個對象時就會觸發(fā)事件。你可以使用 resolving 方法監(jiān)聽這個事件。

$container->resolving(function ($object, $container) {
    // 當(dāng)容器解析任何類型的對象時會被調(diào)用...
});

$container->resolving('Foo', function (Foo $foo, $container) {
    // 當(dāng)容器解析「Foo」類型的對象時會被調(diào)用...
});

感謝各位的閱讀,以上就是“l(fā)aravel中的Service Container的概念及使用方法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對laravel中的Service Container的概念及使用方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

分享標題:laravel中的ServiceContainer的概念及使用方法
網(wǎng)址分享:http://muchs.cn/article10/gedjgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化、做網(wǎng)站、企業(yè)網(wǎng)站制作網(wǎng)站建設(shè)、微信公眾號自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)