欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Laravel随笔 Facade原理/契约的简单使用方法

程序员文章站 2022-04-09 20:37:47
...
  1. 首先Cache类继承于Facade类
  2. Cache类中实现getFacadeAccessor这个静态方法,并返回服务容器中已经注册好的实例名(这里实例名就是和laravel的服务容器绑定了的$abstract)
class Cache extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'cache';
    }
}
  1. 当外界调用Cache::get('test')的时候,就会触发Facade类的魔术方法__callStatic(因为Facade类中,不存在get方法)
  2. 在魔术方法中,实例化之前绑定的‘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);
    }
  1. static::getFacadeRoot();
    public static function getFacadeRoot()
    {
    	// static::getFacadeAccessor()就是Cache类返回的'cache'
        return static::resolveFacadeInstance(static::getFacadeAccessor());
    }
  1. 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];
        }
    }
  1. Facade的使用方法和要求
  • 服务提供者中必须注册了相应的类
  • config/app.php的aliases中,注册相应的Facade
  1. 契约其实说白了就是一个接口
  2. 如何使用契约,可以参考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();
	}
}