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