在laravel中,門面是為應(yīng)用服務(wù)容器中的綁定類提供的一個(gè)“靜態(tài)”接口。維護(hù)時(shí)能夠提供更加易于測(cè)試、更加靈活、簡(jiǎn)明優(yōu)雅的語(yǔ)法,所有的門面都定義在“IlluminateSupportFacades”命名空間下。
本文操作環(huán)境:Windows10系統(tǒng)、Laravel6版、Dell G3電腦。
laravel門面是什么
Facades 為應(yīng)用服務(wù)容器中的綁定類提供了一個(gè)“靜態(tài)”接口。
Laravel 內(nèi)置了很多 Facades ,可以訪問(wèn)絕大部分 Laravel 的功能。
Laravel 的門面作為服務(wù)容器中底層類的“靜態(tài)代理”,相比于傳統(tǒng)靜態(tài)方法,在維護(hù)時(shí)能夠提供更加易于測(cè)試、更加靈活、簡(jiǎn)明優(yōu)雅的語(yǔ)法。
Laravel 的所有門面都定義在 IlluminateSupportFacades 命名空間下。
我們可以輕松訪問(wèn)到門面:
use IlluminateSupportFacadesCache; Route::get('/cache', function () { return Cache::get('key'); });
在整個(gè) Laravel 文檔中,很多例子使用了門面來(lái)演示框架的各種功能特性。
何時(shí)使用 Facades
門面有諸多優(yōu)點(diǎn),其提供了簡(jiǎn)單、易記的語(yǔ)法,讓我們無(wú)需記住長(zhǎng)長(zhǎng)的類名即可使用 Laravel 提供的功能特性,此外,由于他們對(duì) PHP 動(dòng)態(tài)方法的獨(dú)到用法,使得它們很容易測(cè)試。
在使用 Facades 時(shí),有些地方還需要特別注意。
使用 Facades 最主要的風(fēng)險(xiǎn)就是會(huì)引起類作用范圍的膨脹。
因?yàn)?Facades 使用起來(lái)非常簡(jiǎn)單而且不需要注入,就會(huì)使得我們?cè)诓唤?jīng)意間在單個(gè)類中使用許多 Facades,從而導(dǎo)致類變的越來(lái)越大。
而使用依賴注入的時(shí)候,使用的類越多,構(gòu)造方法就會(huì)越長(zhǎng),在視覺上就會(huì)引起注意,提醒你這個(gè)類有點(diǎn)龐大了。因此在使用 Facades 的時(shí)候,要特別注意控制好類的大小,讓類的作用范圍保持短小。
在開發(fā)與 Laravel 進(jìn)行交互的第三方擴(kuò)展包時(shí),建議最好選擇注入 Laravel 契約 ,而不是使用 Facades 的方式來(lái)使用類。因?yàn)閿U(kuò)展包是在 Laravel 本身之外構(gòu)建,所以你無(wú)法使用 Laravel Facades 測(cè)試輔助函數(shù)。
Facades Vs. 依賴注入
依賴注入的主要優(yōu)點(diǎn)之一是切換注入類的實(shí)現(xiàn)的能力。這在測(cè)試的時(shí)候很有用,因?yàn)槟憧梢宰⑷胍粋€(gè) mock 或者 stub ,并斷言在 stub 上調(diào)用的各種方法。
通常,真正的靜態(tài)方法是不可能被 mock 或者 stub。但是,因?yàn)?Facades 使用動(dòng)態(tài)方法來(lái)代理從服務(wù)容器解析的對(duì)象的方法調(diào)用,我們可以像測(cè)試注入的類實(shí)例一樣來(lái)測(cè)試 Facades。例如,像下面的路由:
use IlluminateSupportFacadesCache; Route::get('/cache', function () { return Cache::get('key'); })
我們可以這樣編寫測(cè)試來(lái)驗(yàn)證 Cache::get 方法以我們期望的方式被調(diào)用:
use IlluminateSupportFacadesCache; /** * 一個(gè)基礎(chǔ)功能的測(cè)試用例。 * * @return void */ public function testBasicExample() { Cache::shouldReceive('get') ->with('key') ->andReturn('value'); $this->visit('/cache') ->see('value'); }
【