門面為應用的服務容器中的有效類提供了一個“靜態(tài)”接口。Laravel 附帶了很多門面,你可能在不知道的情況下正在使用它們。Laravel 的門面作為服務容器中的底層類的“靜態(tài)代理”,相比于傳統(tǒng)靜態(tài)方法,在維護時能夠提供更加易于測試、更加靈活的、簡明且富有表現(xiàn)力的預語法。
在 Laravel 應用的上下文中,門面就是一個提供訪問容器中對象的類。該機制原理由Facade
類實現(xiàn),Laravel 自帶的門面,以及你創(chuàng)建的自定義門面,都會繼承自 Illuminate\Support\Facades\Facade
基類。
門面類只需要實現(xiàn)一個方法:getFacadeAccessor
。正是 getFacadeAccessor
方法定義了從容器中解析什么,然后 Facade
基類使用魔術方法從你的門面中調(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 緩存服務的底層實例。
如果我們查看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
方法,該方法的工作就是返回服務容器綁定的名字,當用戶引用 Cache
類的任何靜態(tài)方法時,Laravel 從服務容器中解析 cache 綁定,然后在解析出的對象上調(diào)用所有請求方法(本例中是 get)。
下面列出了每個門面及其對應的底層類,這對深入給定根門面的 API 文檔而言是個很有用的工具。服務容器綁定鍵也被包含進來:
http://wiki.jikexueyuan.com/project/laravel-5.1/images/3.png" alt="" />