Facades
簡介
Facades 為應用程式的服務容器中可用的類別提供一個「靜態」介面。Laravel 附帶許多 facades,甚至你可能在不知情的狀況下已經使用他們!Laravel 「facades」作為在服務容器內基底類別的「靜態代理」,提供了一個簡潔、易表達的語法優點,同時維持比傳統的靜態方法更高的可測試性和彈性。
使用 Facades
在 Laravel 應用程式環境(Context)中,facade 是個提供從容器存取物件的類別。Facade
類別是讓這個機制可以運作的原因。Laravel 的 facades,以及任何你建立的客製化 facades,會繼承基底 Illuminate\Support\Facades\Facade
類別。
facade 類別只需要去實作一個方法:getFacadeAccessor
。getFacadeAccessor
方法的工作定義是從容器中解析出什麼。Facade
基底類別利用 __callStatic()
魔術方法從你的 facade 延遲呼叫來解析物件。
在下面的範例,呼叫了 Laravel 的快取系統。看了一下這個程式碼,或許有人認為靜態方法 get
是被 Cache
類別呼叫的:
<?php
namespace App\Http\Controllers;
use Cache;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 顯示給定使用者的個人資料。
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
$user = Cache::get('user:'.$id);
return view('profile', ['user' => $user]);
}
}
注意在檔案的上方,我們「導入」Cache
facade。這個 facade 做為存取底層實作 Illuminate\Contracts\Cache\Factory
介面的代理。我們使用 facade 的任何呼叫將會傳送給 Laravel 快取服務的底層實例。
如果我們查看 Illuminate\Support\Facades\Cache
類別,你會發現沒有靜態方法 get
:
class Cache extends Facade
{
/**
* 取得元件的註冊名稱。
*
* @return string
*/
protected static function getFacadeAccessor() { return 'cache'; }
}
相反的,Cache
facade 繼承了基底 Facade
類別以及定義了 getFacadeAccessor()
方法。記住,這個方法的工作是回傳服務容器綁定的名稱。當使用者在 Cache
facade 上參考任何的靜態方法,Laravel 會從服務容器解析被綁定的 cache
以及針對物件執行請求的方法(在這個範例中是 get
)。
Facade 類別參考
在下方你可以找到每個 facade 及其底層的類別。這個工具對於透過給定 facade 的來源快速尋找 API 文件相當有用。可應用的服務容器綁定關鍵字也包含在裡面。