Facades
介绍
Facades 提供了一个“静态”接口来访问应用程序服务容器中可用的类。Laravel 附带了许多 facades,你可能在不知不觉中已经在使用它们了!Laravel 的“facades”作为服务容器中底层类的“静态代理”,提供了简洁、富有表现力的语法,同时比传统的静态方法具有更好的可测试性和灵活性。
使用 Facades
在 Laravel 应用程序的上下文中,facade 是一个提供从容器访问对象的类。使这项工作成为可能的机制在 Facade
类中。Laravel 的 facades 以及你创建的任何自定义 facades 都将扩展基础的 Illuminate\Support\Facades\Facade
类。
一个 facade 类只需要实现一个方法:getFacadeAccessor
。getFacadeAccessor
方法的任务是定义从容器中解析什么。Facade
基类利用 __callStatic()
魔术方法将从你的 facade 发出的调用推迟到解析的对象。
在下面的示例中,调用了 Laravel 缓存系统。通过浏览此代码,可能会认为静态方法 get
是在 Cache
类上调用的:
<?php
namespace App\Http\Controllers;
use Cache;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 显示给定用户的个人资料。
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
$user = Cache::get('user:'.$id);
return view('profile', ['user' => $user]);
}
}
注意在文件的顶部我们“导入”了 Cache
facade。这个 facade 作为访问 Illuminate\Contracts\Cache\Factory
接口底层实现的代理。我们使用 facade 进行的任何调用都将传递给 Laravel 缓存服务的底层实例。
如果我们查看 Illuminate\Support\Facades\Cache
类,你会发现没有静态方法 get
:
class Cache extends Facade
{
/**
* 获取组件的注册名称。
*
* @return string
*/
protected static function getFacadeAccessor() { return 'cache'; }
}
相反,Cache
facade 扩展了基础 Facade
类并定义了方法 getFacadeAccessor()
。记住,这个方法的任务是返回服务容器绑定的名称。当用户引用 Cache
facade 上的任何静态方法时,Laravel 从服务容器中解析 cache
绑定,并在该对象上运行请求的方法(在本例中为 get
)。
Facade 类参考
下面你会找到每个 facade 及其底层类。这是一个快速深入了解给定 facade 根的 API 文档的有用工具。还包括了服务容器绑定键(如适用)。