摘要:那么如果用的方式會怎么樣呢現在,不僅看起來更簡潔優雅,而且也可以測試了,因為可以進行,比如說這樣你會發現最有用的地方就是構建簡潔優雅的,同時呢又不會影響到代碼的可測試性。
本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學習群:109256050
該篇翻譯整理自laravel創始人Taylor的文章:Expressive Code & Real Time Facades,屬于《Laravel底層核心技術實戰揭秘》這一課程《laravel底層核心概念解析》這一章的擴展閱讀。
laravel 5.4引入了realtime facade的功能,也即任何一個class都可以隨時拿來當facade用,只要在其namespace前面加上Facades前綴即可。當然這個功能不可能隨處都用到,但是偶爾呢,用它可以實現更簡潔優雅、易于測試的代碼方案。雖然下面的例子講的是laravel 5.4的realtime facade,但是呢,其實也完全可以用在之前的版本上,因為所謂的realtime facade,無非就是系統自動給你注冊成facade而已,鑒于這個功能又不可能到處用到,所以即使在老的版本里,如果你發現facade的這種代碼實現方式更有吸引力,那么自己手動注冊一個facade也完全可以的。
接下來的示例是關于Laravel Forge的,laravel Forge是laravel官方推出的laravel項目部署管理平臺。當使用Forge的時候,你得在Forge后臺將你服務器提供商的賬號信息填上,然后呢交由Forge來具體管理。那么,這里假設呢我們有一個Model叫Provider,也就是對應著不同的主機提供商,比如國外的DigitalOcean、國內的阿里云等。
這里呢假設我們將所有處理外來API請求的class放在AppServices文件夾下,我們得對應每一個主機供應商都有一個“service”class,假設DigitalOcean這家供應商的service class是這樣的:
接下來呢,我們得能夠解析這個服務類,基于我們model里的type這一欄的信息,我們可以使用工廠(factory)模式來實現:
然后呢,我們就可以在需要的地方調用這個工廠,來相應地創建一個server 服務,比如假設在controller里調用:
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 ); // } }我們只想簡單地調用Provider這個實例上的service方法,然后就能獲取到其背后對應的供應商,然后就能直接地createServer。這樣來寫呢,可能更像是我們日常中最直接的思考過程,雖然可能背后具體怎么實現你還沒搞懂。那么怎么來實現呢?假設不借助facade,我們或許可以這樣:
make($this->type); } }貌似可行。但是這樣呢,因為這個factory類是直接在service方法內部實例化的,這是不好的,后期我們無法用它來mock測試。那么如果用realtime facade的方式會怎么樣呢?
type); } }現在,不僅看起來更簡潔優雅,而且也可以測試了,因為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); } }你會發現real-time facade最有用的地方就是構建簡潔、優雅的object APIs,同時呢又不會影響到代碼的可測試性。希望這能給你的實際開發帶來一定啟發。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28216.html
摘要:本文來自原文鏈接歡迎作客我們的學習群該篇屬于底層核心技術實戰揭秘這一課程底層核心概念解析這一章的擴展閱讀。考慮到學員們的基礎差異,為了避免視頻當中過于詳細而連篇累牘,故將一些底層實現相關的知識點以文章形式呈現,供大家預習和隨時查閱。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學習群:109256050該篇屬于《Laravel底層核心技術實戰...
摘要:深入剖析,第二章。如果給方法以默認訪問權限,則只能在同一個包中訪問,這個被認為是可以的,但是不最好,最優雅的方式是通過類。定義外觀模式,為子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。 《深入剖析Tomcat》(How Tomcat Works),第二章。 創建 Request 和 Response 分別實現 ServletRequ...
摘要:的現狀目前是版本,是基于開發。入口文件啟動文件和配置文件框架的入口文件是。在路由中指定控制器類必須寫全命名空間,不然會提示找不到類。目前支持四種數據庫系統以及。使用時發生錯誤,因為在文件中,的默認驅動是。 最近使用 Lumen 做了 2 個業余項目,特此記錄和分享一下。 Lumen 的介紹 在使用一項新的技術時,了解其應用場景是首要的事情。 Lumen 的口號:為速度而生的 La...
閱讀 1751·2023-04-25 22:42
閱讀 2202·2021-09-22 15:16
閱讀 3486·2021-08-30 09:44
閱讀 485·2019-08-29 16:44
閱讀 3304·2019-08-29 16:20
閱讀 2512·2019-08-29 16:12
閱讀 3387·2019-08-29 16:07
閱讀 667·2019-08-29 15:08