門面為應(yīng)用的服務(wù)容器中的有效類提供了一個“靜態(tài)”接口。Laravel附帶了很多門面,你可能在不知道的情況下正在使用它們。Laravel的門面作為服務(wù)容器中的底層類的“靜態(tài)代理”,相比于傳統(tǒng)靜態(tài)方法,在維護(hù)時能夠提供更加易于測試、更加靈活的、簡明且富有表現(xiàn)力的語法。
在Laravel應(yīng)用的上下文中,門面就是一個提供訪問容器中對象的類。該機制原理由Facade
類實現(xiàn),Laravel自帶的門面,以及創(chuàng)建的自定義門面,都會繼承自Illuminate\Support\Facades\Facade
基類。
門面類只需要實現(xiàn)一個方法:getFacadeAccessor
。正是getFacadeAccessor
方法定義了從容器中解析什么,然后Facade
基類使用魔術(shù)方法從你的門面中調(diào)用解析對象。
下面的例子中,我們將會調(diào)用Laravel的緩存系統(tǒng),瀏覽代碼后,也許你會覺得我們調(diào)用了Cache
的靜態(tài)方法get
:
<?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門面。該門面作為代理訪問底層Illuminate\Contracts\Cache\Factory
接口的實現(xiàn)。我們對門面的所有調(diào)用都會被傳遞給Laravel緩存服務(wù)的底層實例。
如果我們查看Illuminate\Support\Facades\Cache
類的源碼,將會發(fā)現(xiàn)其中并沒有靜態(tài)方法get
:
class Cache extends Facade{
/**
* 獲取組件注冊名稱
*
* @return string
*/
protected static function getFacadeAccessor() {
return 'cache';
}
}
Cache
門面繼承Facade
基類并定義了getFacadeAccessor
方法,該方法的工作就是返回服務(wù)容器綁定類的別名,當(dāng)用戶引用Cache
類的任何靜態(tài)方法時,Laravel從服務(wù)容器中解析cache綁定,然后在解析出的對象上調(diào)用所有請求方法(本例中是get)。
下面列出了每個門面及其對應(yīng)的底層類,這對深入給定根門面的API文檔而言是個很有用的工具。服務(wù)容器綁定鍵也被包含進(jìn)來:
更多建議: