前陣子看了點Laravel源碼,越看越亂,網上大部分中文文檔都是直譯,比較生澀難懂,還是決定看英文文檔順便就我的理解做下翻譯整理記錄下來
簡介
門面為應用服務器內可用的類提供了“靜態”接口。Laravel裝載了許多門面,你可能都沒意識到自己正在使用它們!Laravel的門面為服務容器中的基礎類提供了”靜態代理”,提供了簡潔形象的語法,讓我們維護起來比傳統靜態方法更靈活可測。
使用面門
在Laravel的上下文中,facade就是一個類,它提供了容器中對象的訪問入口。讓它工作的核心就是Facade
類。Laravel的門面和任何自定義的門面都要繼承Illuminate\Support\Facades\Facade
類。
facade類只需要實現一個方法:getFacadeAccessor
。getFacdeAccessor
方法的職責就是定義從容器中解析什么。門面的基類使用__callStatic()
魔術方法來延時從facade中調用被解析的對象。
在下面的例子中,調用了Laravel緩存系統。初看之下,你可能會覺得Cache
類的靜態方法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\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
綁定然后運行請求的對象方法(這里是get
)。