前陣子看了點(diǎn)Laravel源碼,越看越亂挠阁,網(wǎng)上大部分中文文檔都是直譯乱灵,比較生澀難懂,還是決定看英文文檔順便就我的理解做下翻譯整理記錄下來(lái)
簡(jiǎn)介
門(mén)面為應(yīng)用服務(wù)器內(nèi)可用的類提供了“靜態(tài)”接口文黎。Laravel裝載了許多門(mén)面惹苗,你可能都沒(méi)意識(shí)到自己正在使用它們!Laravel的門(mén)面為服務(wù)容器中的基礎(chǔ)類提供了”靜態(tài)代理”耸峭,提供了簡(jiǎn)潔形象的語(yǔ)法桩蓉,讓我們維護(hù)起來(lái)比傳統(tǒng)靜態(tài)方法更靈活可測(cè)。
使用面門(mén)
在Laravel的上下文中劳闹,facade就是一個(gè)類院究,它提供了容器中對(duì)象的訪問(wèn)入口。讓它工作的核心就是Facade
類本涕。Laravel的門(mén)面和任何自定義的門(mén)面都要繼承Illuminate\Support\Facades\Facade
類业汰。
facade類只需要實(shí)現(xiàn)一個(gè)方法:getFacadeAccessor
。getFacdeAccessor
方法的職責(zé)就是定義從容器中解析什么菩颖。門(mén)面的基類使用__callStatic()
魔術(shù)方法來(lái)延時(shí)從facade中調(diào)用被解析的對(duì)象样漆。
在下面的例子中,調(diào)用了Laravel緩存系統(tǒng)晦闰。初看之下放祟,你可能會(huì)覺(jué)得Cache
類的靜態(tài)方法get
被調(diào)用了
<?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]);
}
}
注意我們?cè)谖募^上導(dǎo)入的Cache
門(mén)面,這個(gè)門(mén)面作為一個(gè)代理來(lái)訪問(wèn)Illuminate\Contracts\Factory
接口的基礎(chǔ)實(shí)現(xiàn)呻右。任何時(shí)候我們調(diào)用門(mén)面都將會(huì)傳遞給Laravel緩存服務(wù)的基礎(chǔ)實(shí)現(xiàn)舞竿。
如果我們看下Illuminate\Support\Facades\Cache類,你將看到里面沒(méi)有靜態(tài)方法get
:
class Cache extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() { return 'cache'; }
}
取而代之的窿冯,Cache
門(mén)面繼承了Facade
類然后定義了getFacadeAccessor
骗奖。記住,這個(gè)方法的職責(zé)是返回服務(wù)容器綁定名。當(dāng)用到Cache
門(mén)面的任何靜態(tài)方法执桌,Laravel會(huì)從服務(wù)容器中解析cache
綁定然后運(yùn)行請(qǐng)求的對(duì)象方法(這里是get
)鄙皇。