摘要:上面應(yīng)用依賴容器后這段代碼來自從容器中取得中服務(wù)提供者看看官方的例子注冊(cè)一個(gè)服務(wù)在容器中注冊(cè)綁定。使用綁定單例有沒有發(fā)現(xiàn)方法其實(shí)就是往依賴容器里設(shè)置一個(gè)類。然后官方文檔也說了,就是一個(gè)服務(wù)容器,聽名字也知道了其實(shí)就是依賴容器。
其實(shí)laravel中的服務(wù)容器就是一個(gè)依賴容器,依賴容器是什么,請(qǐng)看下文。
依賴注入當(dāng)一個(gè)系統(tǒng)變復(fù)雜后,經(jīng)常會(huì)遇到A類需要B類的方法,B類需要C類的方法這樣的情況。傳統(tǒng)的思路下,我們會(huì)這么寫:
class Bim { public function doSomething() { echo __METHOD__, "|"; } } class Bar { public function doSomething() { $bim = new Bim(); $bim->doSomething(); echo __METHOD__, "|"; } } class Foo { public function doSomething() { $bar = new Bar(); $bar->doSomething(); echo __METHOD__; } } $foo = new Foo(); $foo->doSomething();
應(yīng)用依賴注入的思想(依賴注入聽上去很花哨,其實(shí)質(zhì)是通過構(gòu)造函數(shù)或者某些情況下通過 set 方法將類依賴注入到類中):
改成這樣:
class Bim { public function doSomething() { echo __METHOD__, "|"; } } class Bar { private $bim; public function __construct(Bim $bim) { $this->bim = $bim; } public function doSomething() { $this->bim->doSomething(); echo __METHOD__, "|"; } } class Foo { private $bar; public function __construct(Bar $bar) { $this->bar = $bar; } public function doSomething() { $this->bar->doSomething(); echo __METHOD__; } } $foo = new Foo(new Bar(new Bim())); $foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomething依賴容器
上面類的實(shí)例化還是我們手動(dòng)new的,依賴容器的作用就是把類的實(shí)例化管理起來,應(yīng)用程序需要到Foo類,就從容器內(nèi)取得Foo類,容器創(chuàng)建Bim類,再創(chuàng)建Bar類并把Bim注入,再創(chuàng)建Foo類,并把Bar注入,應(yīng)用程序調(diào)用Foo方法,F(xiàn)oo調(diào)用Bar方法,接著做些其它工作。
上面應(yīng)用依賴容器后(這段代碼來自Twittee):
class Container { private $s = array(); function __set($k, $c) { $this->s[$k] = $c; } function __get($k) { return $this->s[$k]($this); } } $c = new Container(); $c->bim = function () { return new Bim(); }; $c->bar = function ($c) { return new Bar($c->bim); }; $c->foo = function ($c) { return new Foo($c->bar); }; // 從容器中取得Foo $foo = $c->foo; $foo->doSomething(); // Bim::doSomething|Bar::doSomething|Foo::doSomethinglaravel中服務(wù)提供者
看看官方的例子:
注冊(cè)一個(gè)服務(wù):
use RiakConnection; use IlluminateSupportServiceProvider; class TestServiceProvider extends ServiceProvider { /** * 在容器中注冊(cè)綁定。 * * @return void */ public function register() { //使用singleton綁定單例 $this->app->singleton("test",function(){ return new TestService(); }); } }
有沒有發(fā)現(xiàn)register方法其實(shí)就是往依賴容器里設(shè)置一個(gè)類。然后官方文檔也說了,
$this->app就是一個(gè)服務(wù)容器,聽名字也知道了其實(shí)就是依賴容器。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/22886.html
摘要:用匿名函數(shù)的好處在于,這個(gè)服務(wù)綁定到容器以后,并不會(huì)立即產(chǎn)生服務(wù)最終的對(duì)象,只有在這個(gè)服務(wù)解析的時(shí)候,匿名函數(shù)才會(huì)執(zhí)行,此時(shí)才會(huì)產(chǎn)生這個(gè)服務(wù)對(duì)應(yīng)的服務(wù)實(shí)例。 前言 ? 老實(shí)說,第一次老大讓我看laravel框架手冊(cè)的那天早上,我是很絕望的,因?yàn)檎娴臎]接觸過,對(duì)我這種渣渣來說,laravel的入門門檻確實(shí)有點(diǎn)高了,但還是得硬著頭皮看下去(雖然到現(xiàn)在我還有很多沒看懂,也沒用過)。? 后面慢...
摘要:初步嘗試既然最常見的注冊(cè)命令的方式是修改類中的,那么一般正常人都會(huì)從這邊開始下手。又要自己取出實(shí)例,又要自己調(diào)用方法,調(diào)用方法之前還有自己先把實(shí)例化這么繁瑣,肯定不是運(yùn)行時(shí)添加命令的最佳實(shí)踐,所以我決定繼續(xù)尋找更優(yōu)解。 本文首發(fā)于我的博客,原文鏈接:https://blessing.studio/best-... 雖然 Laravel 官方文檔提供的添加 Artisan Command...
摘要:控制反轉(zhuǎn)容器控制反轉(zhuǎn)使依賴注入變得更加便捷。有瑕疵控制反轉(zhuǎn)容器是實(shí)現(xiàn)的控制翻轉(zhuǎn)容器的一種替代方案。容器的獨(dú)立使用即使沒有使用框架,我們?nèi)匀豢梢栽陧?xiàng)目中使用安裝組件來使用的控制反轉(zhuǎn)容器。在沒有給定任何信息的情況下,容器是無法實(shí)例化相關(guān)依賴的。 聲明:本文并非博主原創(chuàng),而是來自對(duì)《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當(dāng)然也不是原汁原味...
摘要:劃下重點(diǎn),服務(wù)容器是用于管理類的依賴和執(zhí)行依賴注入的工具。類的實(shí)例化及其依賴的注入,完全由服務(wù)容器自動(dòng)的去完成。 本文首發(fā)于 深入剖析 Laravel 服務(wù)容器,轉(zhuǎn)載請(qǐng)注明出處。喜歡的朋友不要吝嗇你們的贊同,謝謝。 之前在 深度挖掘 Laravel 生命周期 一文中,我們有去探究 Laravel 究竟是如何接收 HTTP 請(qǐng)求,又是如何生成響應(yīng)并最終呈現(xiàn)給用戶的工作原理。 本章將帶領(lǐng)大...
摘要:因?yàn)槁酚蓪用媸軜I(yè)務(wù)影響很大,經(jīng)常修改一些功能的行為,所以后來大部分測(cè)試都是針對(duì)層面的單元測(cè)試。在我了解的過程中,我發(fā)現(xiàn)中文網(wǎng)絡(luò)上對(duì)的討論非常分散,于是我創(chuàng)建了中文社區(qū),到年末已經(jīng)有個(gè)注冊(cè)用戶和個(gè)帖子了。 https://jysperm.me/2016/02/programming-of-2015/ 從 2014 年末開始開發(fā)的一個(gè)互聯(lián)網(wǎng)金融項(xiàng)目終于在今年三月份上線了,這是一個(gè) Node...
閱讀 3637·2021-11-19 09:40
閱讀 3095·2019-08-30 15:54
閱讀 2313·2019-08-30 15:44
閱讀 3196·2019-08-29 15:35
閱讀 3331·2019-08-29 12:22
閱讀 2861·2019-08-28 18:01
閱讀 3140·2019-08-26 13:54
閱讀 902·2019-08-26 12:24