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