假面(Facades)
簡介
假面提供了一種類似‘靜態’接口的方式來從服務容器中提取可用類的方法。laravel 自身附帶了許多的假面,你可能在還不知道它的時候就已經使用過它了。laravel 的假面服務就好像是一個從服務容器中取出底層類的代理(你帶上我的面具,你就可以使用我的方法了),它提供了一種簡潔語法的同時保持了比傳統靜態方法更高的可測試性和靈活性。
使用假面
在 laravel 中,假面是一種能夠訪問服務容器中對象的類。而使這項工作能夠運行的就是 Facade
類。laravel 中的假面或者任何你所自定義的假面都必須要繼承 Illuminate\Support\Facades\Facade
類。
一個假面類僅僅只需要去實現一個單一的 getFacadeAccessor
方法就可以了。而 getFacadeAccessor
方法的任務就是定義需要從服務容器中返回什么對象。Facade
基類使用了 __callStatic()
魔術方法讓假面來延遲訪問容器中相應的對象。
在下面的例子中,使用了 laravel 緩存系統的一個方法調用。如果只是匆匆的看一眼,你很可能會覺得這是在調用緩存類的靜態方法 get
:
<?php
namespace App\Http\Controllers;
use Cache;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* Show the profile for the given user.
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
$user = Cache::get('user' . $id);
return view('profile', ['user' => $user]);
}
}
你應該注意到我們在文件的頂部引入的是 Cache
假面。這個假面服務相當于訪問 Illuminate\Contracts\Cache\Factory
接口底層實現的代理。所有使用假面調用的方法都會在 laravel 緩存服務的底層實現進行傳遞調用。
如果我們看一下 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
假面的靜態方法時,laravel 從服務容器中返回綁定了 cache
為名稱的對象,并且使用這個對象調用所請求的方法。
假面類參考
在下面的表格中你會找到所有的假面及其所對應的底層實現類。這是一個可以迅速挖掘給定假面 API 的有用工具。在服務容器中所給的綁定鍵也包括在其中。