Facades
介紹
Facades 提供一個 "靜態" 介面讓類別能夠運用在應用程式的 IoC容器 (Ioc container)。 Laravel 裝載很多 facades,甚至你可能不知不覺已經使用過它們了!
有時候,你也許希望為你的應用程式和套件建立自己的 facades,所以讓我們來探討這些類別的概念、開發和用法。
注意: 在深入 facades 之前,強烈建議先熟悉了解 Laravel 的 IoC容器。
解釋
對 Laravel 應用程式而言,facade 是提供從容器存取物件的一個類別。 能讓這裝置正常運作的原因,正是這些 Facade
類別。 Laravel 的 facades 以及任何你所建立的自訂 facades,都將繼承這個類別來當基礎。
你的 facade 類別只需要實作一個方法 getFacadeAccessor
。 getFacadeAccessor
的工作就是去定義哪些東西要從容器分析出來。 而 Facade
基本類別利用 __callStatic()
神奇方法來從你的 facade 呼叫並分析物件。
實際使用
下面是一個 Laravel 快取系統呼叫的範例。 從程式碼中粗略來看,假設 Cache
類別的靜態方法 get
正被呼叫。
$value = Cache::get('key');
然而,如果我們試著看看 Illuminate\Support\Facades\Cache
這個類別,你將會發現它並沒有 get
靜態方法:
class Cache extends Facade {
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return 'cache'; }
}
這個 Cache 類別繼承了基本的 Facade
類別,並且定義了 getFacadeAccessor()
方法。 記住,這個方法的工作是用來回傳控制反轉所綁定的名稱。
當一個使用者在 Cache
這個 facade 參照任何靜態方法,Laravel 會從控制反轉容器中分析被綁定的 cache
,並執行被請求的方法(這個案例就是 get
)。
所以,我們的 Cache::get
呼叫起來,應該會被覆寫像是:
$value = $app->make('cache')->get('key');
建立Facades
為自己的應用程式或套件建立 facade 是相當簡單的。 你只需要三件事:
- 一個控制反轉(Ioc)綁定
- 一個 facade 類別
- 一個 facade 別名設定
看看這個範例,這裡我們有一個類別 PaymentGateway\Payment
定義如下。
namespace PaymentGateway;
class Payment {
public function process()
{
//
}
}
我們需要能夠從控制反轉容器中分析這個類別。 所以我們進行綁定:
App::bind('payment', function()
{
return new \PaymentGateway\Payment;
});
綁定後將會建立一個被命名為 PaymentServiceProvider
新的 服務提供者 (service provider) 服務供應器。並追加到 register
方法。 你可以從 app/config/app.php
追加設定讓 Laravel 讀取你的服務供應器。
接下來,我們建立自己的 facade 類別:
use Illuminate\Support\Facades\Facade;
class Payment extends Facade {
protected static function getFacadeAccessor() { return 'payment'; }
}
最後,如果我們想要的話,可以從 app/config/app.php
的設定檔追加 facade 別名到 aliases
陣列中。 現在,我們能夠從 Payment
實例來呼叫 process
方法。
Payment::process();
模擬Facades
單元測試是為什麼要使用 facades 來作業的重要一環。 事實上,可測試性甚至是 facades 存在的主要理由。 更多資訊可參考 模擬Facades (mocking facades) 這篇章節。