這篇文章主要講解了“l(fā)aravel中的Service Container的概念及使用方法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“l(fā)aravel中的Service Container的概念及使用方法”吧!
創(chuàng)新新互聯(lián),憑借十余年的做網(wǎng)站、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),本著真心·誠(chéng)心服務(wù)的企業(yè)理念服務(wù)于成都中小企業(yè)設(shè)計(jì)網(wǎng)站有上1000家案例。做網(wǎng)站建設(shè),選創(chuàng)新互聯(lián)建站。
The Laravel service container is a powerful tool for managing class dependencies and performing dependency injection.
從Laravel官方文檔對(duì)于Service Container的解釋可以看出,它的作用就是幫助我們管理和進(jìn)行依賴注入的。
在《依賴注入》中,我們看到使用依賴注入可以極大的降低代碼的耦合度,但是也帶來(lái)了一個(gè)缺點(diǎn),就是需要自己管理注入的對(duì)象。
如果一個(gè)組件有很多依賴,我們需要?jiǎng)?chuàng)建多個(gè)參數(shù)的setter方法來(lái)傳遞依賴關(guān)系,或者建立一個(gè)多個(gè)參數(shù)的構(gòu)造函數(shù)來(lái)傳遞它們,另外在使用組件前還要每次都創(chuàng)建依賴,這讓我們的代碼像這樣不易維護(hù)。
所以為依賴實(shí)例提供一個(gè)容器(Service Container),就是一個(gè)實(shí)用而且優(yōu)雅的方法。
比如下面是laravel的入口文件(已去掉注釋?zhuān)?/p>
// 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
,其中$app
是Illuminate\Foundation\Application
的一個(gè)實(shí)例,而Illuminate\Foundation\Application
類(lèi)繼承自Container,所以$app
實(shí)際上就是一個(gè)Service Container。
然后下面的三個(gè)singleton方法定義了當(dāng)依賴Illuminate\Contracts\Http\Kernel
、Illuminate\Contracts\Console\Kernel
、Illuminate\Contracts\Debug\ExceptionHandler
這三個(gè)接口時(shí),注入哪個(gè)類(lèi)的單例。
然后看public/index.php
,其中的make方法實(shí)際上就是用Service Container來(lái)new一個(gè)Illuminate\Contracts\Http\Kernel
實(shí)例,跟普通new的區(qū)別就是會(huì)把他的依賴自動(dòng)注入進(jìn)去。
是不是很簡(jiǎn)潔?
其實(shí)不單是Laravel,像Yii2、Phalcon等框架都通過(guò)實(shí)現(xiàn)容器來(lái)管理依賴注入。
既然是一個(gè)容器,無(wú)非就是兩個(gè)事,往里放東西和往外取東西,對(duì)應(yīng)到Service Container就是綁定(Binding)和解析(Resolving)。
在Laravel的Service Provider中,可以通過(guò)$this->app
獲取容器,除此之外,還可以使用app()
來(lái)獲取容器。
如果在Laravel外使用Service Container,直接new一個(gè)Illuminate\Container\Container
就可以獲得容器了。
以下都用$container代表獲取到的容器。
綁定返回接口的實(shí)例
//使用閉包 $container->bind('BarInterface', function(){ return new Bar(); }); //或者使用字符串 $container->bind('FooInterface', 'Foo');
綁定單例
singletion 方法綁定一個(gè)只會(huì)被解析一次的類(lèi)或接口至容器中,且后面的調(diào)用都會(huì)從容器中返回相同的實(shí)例:
$container->singleton('BarInterface', function(){ return new Bar(); });
綁定實(shí)例
你也可以使用 instance 方法,綁定一個(gè)已經(jīng)存在的對(duì)象實(shí)例至容器中。后面的調(diào)用都會(huì)從容器中返回指定的實(shí)例:
$bar = new Bar(); $bar->setSomething(new Something); $container->instance('Bar', $bar);
情境綁定
有時(shí)候,你可能有兩個(gè)類(lèi)使用到相同接口,但你希望每個(gè)類(lèi)都能注入不同實(shí)現(xiàn)。
$container->when('Man') ->needs('PartnerInterface') ->give('Woman'); $container->when('Woman') ->needs('PartnerInterface') ->give('Man');
標(biāo)記
有些時(shí)候,可能需要解析某個(gè)「分類(lèi)」下的所有綁定。
$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'];
解析被標(biāo)記綁定
$familyMembers = $container->tagged('familyMembers'); foreach ($familyMembers as $inpidual) { $inpidual->doSomething(); }
每當(dāng)服務(wù)容器解析一個(gè)對(duì)象時(shí)就會(huì)觸發(fā)事件。你可以使用 resolving 方法監(jiān)聽(tīng)這個(gè)事件。
$container->resolving(function ($object, $container) { // 當(dāng)容器解析任何類(lèi)型的對(duì)象時(shí)會(huì)被調(diào)用... }); $container->resolving('Foo', function (Foo $foo, $container) { // 當(dāng)容器解析「Foo」類(lèi)型的對(duì)象時(shí)會(huì)被調(diào)用... });
感謝各位的閱讀,以上就是“l(fā)aravel中的Service Container的概念及使用方法”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)laravel中的Service Container的概念及使用方法這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
分享標(biāo)題:laravel中的ServiceContainer的概念及使用方法
網(wǎng)址分享:http://chinadenli.net/article10/gedjgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、做網(wǎng)站、企業(yè)網(wǎng)站制作、網(wǎng)站建設(shè)、微信公眾號(hào)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)