成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

通過facade(尤其是realtime facade)來使代碼更優(yōu)雅

Eric / 3236人閱讀

摘要:那么如果用的方式會怎么樣呢現(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

相關(guān)文章

  • PHP中的facade pattern(外觀模式)

    摘要:本文來自原文鏈接歡迎作客我們的學(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)...

    jaysun 評論0 收藏0
  • 外觀設(shè)計模式

    摘要:外觀設(shè)計模式的優(yōu)點易于使用在實現(xiàn)形式上通常占用較小的內(nèi)存。抽象的注意事項外觀設(shè)計模式雖然少有劣勢,但值得注意的一個問題是性能。 當(dāng)我們豎起一個門面時,我們向外展示的只是一種外表,它可能隱藏著一個非同一般的事實。這也就是我們所要說的外觀設(shè)計模式,這種模式為一大段的代碼體提供了一個便捷的高級接口,隱藏了底層復(fù)雜的實現(xiàn)。這種設(shè)計模式簡化代碼的呈現(xiàn)形式,給開發(fā)人員一個API,同時也能提高代碼的...

    zzbo 評論0 收藏0
  • 外觀模式(Facade Pattern)

    摘要:深入剖析,第二章。如果給方法以默認訪問權(quán)限,則只能在同一個包中訪問,這個被認為是可以的,但是不最好,最優(yōu)雅的方式是通過類。定義外觀模式,為子系統(tǒng)中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。 《深入剖析Tomcat》(How Tomcat Works),第二章。 創(chuàng)建 Request 和 Response 分別實現(xiàn) ServletRequ...

    LMou 評論0 收藏0
  • Lumen 初體驗(二)

    摘要:的現(xiàn)狀目前是版本,是基于開發(fā)。入口文件啟動文件和配置文件框架的入口文件是。在路由中指定控制器類必須寫全命名空間,不然會提示找不到類。目前支持四種數(shù)據(jù)庫系統(tǒng)以及。使用時發(fā)生錯誤,因為在文件中,的默認驅(qū)動是。 最近使用 Lumen 做了 2 個業(yè)余項目,特此記錄和分享一下。 Lumen 的介紹 在使用一項新的技術(shù)時,了解其應(yīng)用場景是首要的事情。 Lumen 的口號:為速度而生的 La...

    Cheriselalala 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<