摘要:那么如果用的方式會怎么樣呢現(xiàn)在,不僅看起來更簡潔優(yōu)雅,而且也可以測試了,因為可以進行,比如說這樣你會發(fā)現(xiàn)最有用的地方就是構(gòu)建簡潔優(yōu)雅的,同時呢又不會影響到代碼的可測試性。
本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050
該篇翻譯整理自laravel創(chuàng)始人Taylor的文章:Expressive Code & Real Time Facades,屬于《Laravel底層核心技術(shù)實戰(zhàn)揭秘》這一課程《laravel底層核心概念解析》這一章的擴展閱讀。
laravel 5.4引入了realtime facade的功能,也即任何一個class都可以隨時拿來當(dāng)facade用,只要在其namespace前面加上Facades前綴即可。當(dāng)然這個功能不可能隨處都用到,但是偶爾呢,用它可以實現(xiàn)更簡潔優(yōu)雅、易于測試的代碼方案。雖然下面的例子講的是laravel 5.4的realtime facade,但是呢,其實也完全可以用在之前的版本上,因為所謂的realtime facade,無非就是系統(tǒng)自動給你注冊成facade而已,鑒于這個功能又不可能到處用到,所以即使在老的版本里,如果你發(fā)現(xiàn)facade的這種代碼實現(xiàn)方式更有吸引力,那么自己手動注冊一個facade也完全可以的。
接下來的示例是關(guān)于Laravel Forge的,laravel Forge是laravel官方推出的laravel項目部署管理平臺。當(dāng)使用Forge的時候,你得在Forge后臺將你服務(wù)器提供商的賬號信息填上,然后呢交由Forge來具體管理。那么,這里假設(shè)呢我們有一個Model叫Provider,也就是對應(yīng)著不同的主機提供商,比如國外的DigitalOcean、國內(nèi)的阿里云等。
這里呢假設(shè)我們將所有處理外來API請求的class放在AppServices文件夾下,我們得對應(yīng)每一個主機供應(yīng)商都有一個“service”class,假設(shè)DigitalOcean這家供應(yīng)商的service class是這樣的:
接下來呢,我們得能夠解析這個服務(wù)類,基于我們model里的type這一欄的信息,我們可以使用工廠(factory)模式來實現(xiàn):
然后呢,我們就可以在需要的地方調(diào)用這個工廠,來相應(yīng)地創(chuàng)建一個server 服務(wù),比如假設(shè)在controller里調(diào)用:
factory = $factory; } public function store(Request $request, Provider $provider) { $service = $this->factory->make($provider->type); $response = $service->createServer($request->name, $request->size); // } }但是呢,我覺得這樣還是有些繁瑣,我想要是這樣來用該多好呢?
service()->createServer( $request->name, $request->size ); // } }我們只想簡單地調(diào)用Provider這個實例上的service方法,然后就能獲取到其背后對應(yīng)的供應(yīng)商,然后就能直接地createServer。這樣來寫呢,可能更像是我們?nèi)粘V凶钪苯拥乃伎歼^程,雖然可能背后具體怎么實現(xiàn)你還沒搞懂。那么怎么來實現(xiàn)呢?假設(shè)不借助facade,我們或許可以這樣:
make($this->type); } }貌似可行。但是這樣呢,因為這個factory類是直接在service方法內(nèi)部實例化的,這是不好的,后期我們無法用它來mock測試。那么如果用realtime facade的方式會怎么樣呢?
type); } }現(xiàn)在,不僅看起來更簡潔優(yōu)雅,而且也可以測試了,因為facade可以進行mock,比如說這樣:
create([ "id" => 1, "type" => "DigitalOcean", ]); $service = Mockery::mock(ServerProvider::class); ServerProviderFactory::shouldReceive("make") ->with("DigitalOcean") ->andReturn($service); $service->shouldReceive("createServer") ->once() ->with("web", "2GB") ->andReturn("server-id"); $response = $this->json("POST", "/api/providers/1/server", [ "name" => "web", "size" => "2GB", ]); $response->assertStatus(201); } }你會發(fā)現(xiàn)real-time facade最有用的地方就是構(gòu)建簡潔、優(yōu)雅的object APIs,同時呢又不會影響到代碼的可測試性。希望這能給你的實際開發(fā)帶來一定啟發(fā)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28216.html
摘要:本文來自原文鏈接歡迎作客我們的學(xué)習(xí)群該篇屬于底層核心技術(shù)實戰(zhàn)揭秘這一課程底層核心概念解析這一章的擴展閱讀。考慮到學(xué)員們的基礎(chǔ)差異,為了避免視頻當(dāng)中過于詳細而連篇累牘,故將一些底層實現(xiàn)相關(guān)的知識點以文章形式呈現(xiàn),供大家預(yù)習(xí)和隨時查閱。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050該篇屬于《Laravel底層核心技術(shù)實戰(zhàn)...
摘要:外觀設(shè)計模式的優(yōu)點易于使用在實現(xiàn)形式上通常占用較小的內(nèi)存。抽象的注意事項外觀設(shè)計模式雖然少有劣勢,但值得注意的一個問題是性能。 當(dāng)我們豎起一個門面時,我們向外展示的只是一種外表,它可能隱藏著一個非同一般的事實。這也就是我們所要說的外觀設(shè)計模式,這種模式為一大段的代碼體提供了一個便捷的高級接口,隱藏了底層復(fù)雜的實現(xiàn)。這種設(shè)計模式簡化代碼的呈現(xiàn)形式,給開發(fā)人員一個API,同時也能提高代碼的...
摘要:深入剖析,第二章。如果給方法以默認訪問權(quán)限,則只能在同一個包中訪問,這個被認為是可以的,但是不最好,最優(yōu)雅的方式是通過類。定義外觀模式,為子系統(tǒng)中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。 《深入剖析Tomcat》(How Tomcat Works),第二章。 創(chuàng)建 Request 和 Response 分別實現(xiàn) ServletRequ...
摘要:的現(xiàn)狀目前是版本,是基于開發(fā)。入口文件啟動文件和配置文件框架的入口文件是。在路由中指定控制器類必須寫全命名空間,不然會提示找不到類。目前支持四種數(shù)據(jù)庫系統(tǒng)以及。使用時發(fā)生錯誤,因為在文件中,的默認驅(qū)動是。 最近使用 Lumen 做了 2 個業(yè)余項目,特此記錄和分享一下。 Lumen 的介紹 在使用一項新的技術(shù)時,了解其應(yīng)用場景是首要的事情。 Lumen 的口號:為速度而生的 La...
閱讀 1800·2023-04-25 22:42
閱讀 2224·2021-09-22 15:16
閱讀 3497·2021-08-30 09:44
閱讀 498·2019-08-29 16:44
閱讀 3318·2019-08-29 16:20
閱讀 2525·2019-08-29 16:12
閱讀 3397·2019-08-29 16:07
閱讀 677·2019-08-29 15:08