假面(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 的有用工具。在服务容器中所给的绑定键也包括在其中。