Laravel随笔 Facade原理/契约的简单使用方法
程序员文章站
2022-04-09 20:37:47
...
- 首先Cache类继承于Facade类
- Cache类中实现
getFacadeAccessor
这个静态方法,并返回服务容器中已经注册好的实例名(这里实例名就是和laravel的服务容器绑定了的$abstract)
class Cache extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'cache';
}
}
- 当外界调用
Cache::get('test')
的时候,就会触发Facade类的魔术方法__callStatic
(因为Facade类中,不存在get方法) - 在魔术方法中,实例化之前绑定的‘cache’类后调用其‘get’方法
public static function __callStatic($method, $args)
{
$instance = static::getFacadeRoot();
if (! $instance) {
throw new RuntimeException('A facade root has not been set.');
}
return $instance->$method(...$args);
}
static::getFacadeRoot();
public static function getFacadeRoot()
{
// static::getFacadeAccessor()就是Cache类返回的'cache'
return static::resolveFacadeInstance(static::getFacadeAccessor());
}
-
resolveFacadeInstance
这里就是解析服务容器绑定的实例了
protected static function resolveFacadeInstance($name)
{
// $name == (string) 'cache'
if (is_object($name)) {
return $name;
}
if (isset(static::$resolvedInstance[$name])) {
return static::$resolvedInstance[$name];
}
if (static::$app) {
return static::$resolvedInstance[$name] = static::$app[$name];
}
}
- Facade的使用方法和要求
- 服务提供者中必须注册了相应的类
- config/app.php的aliases中,注册相应的Facade
- 契约其实说白了就是一个接口
- 如何使用契约,可以参考https://www.jianshu.com/p/8bb376be3b02
- 声明一个interface并实现这个接口
- 在App\Providers\AppServiceProvider 中的register方法中,将实例绑定到接口
- 在需要依赖注入的方法中,直接依赖这个接口,Laravel会在调用这个接口的时候,默认使用前面绑定好的类
interface AInterface {
public function get();
}
class B implements AInterface {
public function get() {
;
}
}
class C {
// 此时注入到index方法里的是B实例
public function index(AInterface $A) {
$A->get();
}
}
上一篇: LUA string库使用小结