外观模式
介绍
外观模式为应用程序的服务容器中可用的类提供了一个“静态”接口。Laravel 附带了许多外观模式,您可能在不知不觉中已经在使用它们!Laravel 的“外观模式”充当服务容器中底层类的“静态代理”,提供简洁、富有表现力的语法,同时比传统的静态方法具有更高的可测试性和灵活性。
使用外观模式
在 Laravel 应用程序的上下文中,外观模式是一个类,它提供对容器中对象的访问。使这项工作成为可能的机制在于 Facade
类。Laravel 的外观模式以及您创建的任何自定义外观模式都将扩展基础的 Illuminate\Support\Facades\Facade
类。
外观类只需要实现一个方法:getFacadeAccessor
。getFacadeAccessor
方法的任务是定义从容器中解析什么。Facade
基类利用 __callStatic()
魔术方法将来自您的外观的调用推迟到已解析的对象。
在下面的示例中,调用了 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
外观模式。此外观模式充当访问 Illuminate\Contracts\Cache\Factory
接口的底层实现的代理。我们使用外观模式进行的任何调用都将传递给 Laravel 缓存服务的底层实例。
如果我们查看 Illuminate\Support\Facades\Cache
类,您会发现没有静态方法 get
:
class Cache extends Facade
{
/**
* 获取组件的注册名称。
*
* @return string
*/
protected static function getFacadeAccessor() { return 'cache'; }
}
相反,Cache
外观模式扩展了基础 Facade
类并定义了方法 getFacadeAccessor()
。请记住,此方法的任务是返回服务容器绑定的名称。当用户引用 Cache
外观模式上的任何静态方法时,Laravel 从服务容器中解析 cache
绑定,并对该对象运行请求的方法(在本例中为 get
)。
外观类参考
下面您将找到每个外观模式及其底层类。这是快速查找给定外观模式根的 API 文档的有用工具。服务容器绑定键也在适用的地方包含。