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