1 什么是Facades
Facades 为应用的 服务容器 提供了一个「静态」 接口。Laravel 自带了很多 Facades,可以访问绝大部分功能。Laravel Facades 实际是服务容器中底层类的 「静态代理」 ,相对于传统静态方法,在使用时能够提供更加灵活、更加易于测试、更加优雅的语法。例如 路由的使用:
Route::路由方法();
如果不使用静态方式则需要创建 Illuminate\Routing\Router 类的实例来调用对应的路由方法:
$route = app()->make('router');
$route->get('instance', function(){
return 'instance 的 路由';
});
2 工作原理
在 Laravel 应用中,Facade 就是一个可以从容器访问对象的类。其中核心的部件就是 Facade 类。不管是 Laravel 自带的 Facades,还是自定义的 Facades,都继承自 Illuminate\Support\Facades\Facade 类。
Facade 基类使用了__callStatic() 魔术方法,直到对象从容器中被解析出来后,才会进行调用。
3 自定义 Facades
当我们自己提供了一个服务类,想要让该类也能实现静态调用,我们可以定义属于我们自己的 Facades。自定义 Facades 主要有以下几个步骤:
1.创建服务类;
2.创建并编写代理类:
实现了上述步骤之后就可以通过 静态方式调用。当然我们还可以结合于服务提供者来实现。
创建工具类
<?php
namespace App\Utils;
class SayHello
{
public function say()
{
return '你好';
}
}
自定义门面
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class SayHello extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
# 找到真正的类
// return \App\Utils\SayHello::class;
//或者在服务提供者中注册
return 'sh';
}
}
调用
# 门面
/*
创建自己的服务类
给服务类创建门面类:
1.继承 Illuminate\Support\Facades\Facade 类;
2.返回 能找到真实了的 内容; - 也可以注入到容器中,返回标识
*/
Route::any('fac', function(){
dump(\App\Facades\SayHello::say());
});
网友评论