回到最上方

文件

Facades

介紹

Facades 提供一個 "靜態" 介面讓類別能夠運用在應用程式的 IoC容器 (Ioc container)。 Laravel 裝載很多 facades,甚至你可能不知不覺已經使用過它們了!

有時候,你也許希望為你的應用程式和套件建立自己的 facades,所以讓我們來探討這些類別的概念、開發和用法。

注意: 在深入 facades 之前,強烈建議先熟悉了解 Laravel 的 IoC容器

解釋

對 Laravel 應用程式而言,facade 是提供從容器存取物件的一個類別。 能讓這裝置正常運作的原因,正是這些 Facade 類別。 Laravel 的 facades 以及任何你所建立的自訂 facades,都將繼承這個類別來當基礎。

你的 facade 類別只需要實作一個方法 getFacadeAccessorgetFacadeAccessor 的工作就是去定義哪些東西要從容器分析出來。 而 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) 這篇章節。

討論