Laravel Facades 是 Laravel 框架的一个很棒的功能,它通过简单的界面提供对服务的便捷访问。当我第一次学习 Laravel 时,有一件事让我感到困惑,那就是 Facade 访问器方法。
一旦你理解了 Facade 是访问 Laravel 服务容器中底层服务的便捷方式,你就可以轻松跟踪任何 Facade 背后的服务。每个 Facade 都提供了一个
getFacadeAccessor()
指向注册服务名称的方法。
以下是外观访问器的一个例子
DB
正面:
// Illuminate\Support\Facades\DB;受保护
静止的
功能
获取FacadeAccessor
(){
返回
'db'
;}
因此,
'db'
字符串指向容器中的一个服务,外观将使用它来解析。如果你跳转到
tinker
会话中,你可以自己尝试一下:

一些 Facades 可能会解析为管理器类,然后将方法动态传递给底层宏或数据库连接类:
民众
功能
__称呼
($方法,$参数){
如果
(
静止的::
有宏
($method)) {
返回
$this
->
宏调用
($方法,$参数);}
返回
$this
->
联系
()
->
$method(
...
$参数);}
当没有连接调用时,DatabaseManager 将使用默认连接(
sqlite
在我上面的例子中),并在该连接上调用方法。
我建议阅读 Laravel 中 Facades 的工作原理 文档 ,其中还有一个 Facade 列表 参考 可通过框架获取。
在 Laravel 中创建自己的 Facades
如果您不直接创建插件或使用 Laravel 框架,为什么还要在应用程序中创建 Facade?有些开发人员更喜欢只对应用程序代码中定义的服务使用依赖注入,这很好。但是,我发现通过帮助程序或
App\Facades
命名空间。我喜欢 Laravel 的灵活性,同时仍然制定约定,以便在不熟悉的代码库中提高工作效率。
要在应用程序代码中创建 Facade,我建议使用
make:class
命令来生成 Facade,您可以按如下方式操作:
php artisan make:class App/Facades/Example
假设你在应用服务提供商中定义了一项服务,名为
App\ExampleService
;然后您可以在生成类之后为其创建一个 Facade:
命名空间
应用\立面
;使用
照明\支持\立面\立面
;班级
例子
延伸
正面{
民众
静止的
功能
获取FacadeAccessor
(){
返回
'example_service'
;}}
如果您没有定义别名,您可以轻松地将 Facade 访问器设为完全限定类的字符串,或者在服务提供者中使用字符串来定义它:
民众
静止的
功能
获取FacadeAccessor
(){
返回
\App\ExampleService
::班级
;}
Facades 具有在测试中直接模拟底层服务类的便利性:
使用
应用程序\立面\示例
;例子
::
应该接收
(
'getLatestPosts'
)
->
和
(日期之后)
->
并返回
($test_posts)
如果你不使用 Facade,Laravel 还提供了其他方便的模拟方法,例如
partialMock()
方便地在测试中将服务替换为模拟。使用该服务,您可以直接在测试中执行此操作,如下所示:
模拟
=
$this
->
部分模拟
(
我的 API 服务
::班级
,
功能
(
模拟界面
$mock) {模拟
->
应该接收
(
'getLatestPosts'
)
->
和
(日期之后)
->
并返回
($test_posts)});
由您决定要采用的方法,但如果您在应用程序中大量使用服务,请考虑创建一个 Facade,以便在使用服务时提供一些便利,而不会丢失依赖注入提供的功能。






