前阵子看了点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
)。