一个serviceprovider就是一个解决某个功能的公用模块,实际上可以直接用在di里注册然后从di中取出,为啥还要搞个facade呢?

有几个方面的原因

1、把实例化移入到serviceprovider,自己负责自己的初始化,这样简化代码,di注册的地方更加简洁

class SomeServiceProvider extends ServiceProvider {

  public function register() {

      $this->app->bind('some', new Some());

  }

}

在register里直接实例化对象

2、使用facade可以方便更换serviceprovider,只要它们提供的方法一致。

比如我们有个日志服务,如采用facade的方式,那么当觉得这个日志服务性能不够好时,想更换更好的日志服务,直接在getFacadeAccessor里更换对应的服务类名即可,而不用大改项目里的代码

如redis的Facade

protected static function getFacadeAccessor()
{
return 'redis';
}

3、方便调用函数,可以直接用静态方法调用,因为facade实际调用的是serviceprovider对象

这是facade的中__callStatic函数,可见实际是调用serviceprovider实例

 /**
* Handle dynamic, static calls to the object.
*
* @param string $method
* @param array $args
* @return mixed
*/
public static function __callStatic($method, $args)
{
$instance = static::getFacadeRoot(); if (! $instance) {
throw new RuntimeException('A facade root has not been set.');
} switch (count($args)) {
case 0:
return $instance->$method(); case 1:
return $instance->$method($args[0]); case 2:
return $instance->$method($args[0], $args[1]); case 3:
return $instance->$method($args[0], $args[1], $args[2]); case 4:
return $instance->$method($args[0], $args[1], $args[2], $args[3]); default:
return call_user_func_array([$instance, $method], $args);
}
}

有一利则有一弊,调用嵌套太多,理解起来复杂,而且我觉得速度上也会减慢,当然现在的大型网站速度瓶颈都在数据库io上,这点效率损失还是可以接受的。

4、调用流程为Facade--> serviceprovider --

Facade会加载serviceprovider 实例化register 返回的对象 SomeObject

调用时SomeCalss::method,会Facade::__callStatic ,即 object->menthod

facade 相当于把di调用的di->get("some")->method()简化了

serviceprovider 则相当于简化di的配置 ,即di->add(someComeponent,config)

会读取config目录下的所有

最新文章

  1. ElasticSearch5中文分词(IK)
  2. # C/C++的笔试题目
  3. Linux shell的&&和||
  4. Cinder相关命令收集
  5. SSH整合常见错误
  6. Arrays.sort 与 Collections.sort
  7. poj2299
  8. wordpress数据表结构
  9. python爬虫实战(二)--------千图网高清图
  10. java程序启动参数-D含义详解
  11. 通过Xshell如何从Linux服务器下载文件(亲测可行)
  12. VS2010编译VS2008工程时,LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
  13. Jetson TX2(1)ubutu1604--安装Nvidia Linux驱动
  14. .NET 发送电子邮件
  15. 中南大学2018年ACM暑期集训前期训练题集(入门题) Q: Simple Line Editor
  16. requestNextAnimationFrame兼容主浏览器方法
  17. KOL:Key Opinion Leader
  18. Python入门与基本概念
  19. curl命令实现上网认证登录
  20. 【Java面试题】43 说出一些常用的类,包,接口,请各举5个

热门文章

  1. 代码管理(一)git
  2. Digital Color Meter 颜色值提取工具
  3. Eclipse插件的安装与配置
  4. [ACM] hdu 1253 胜利大逃亡 (三维BFS)
  5. http1.0 和 http1.1 主要区别
  6. css 温故而知新 字体方向 将文字竖着显示
  7. office2010激活 错误代码0X8007000D,KMS激活0x8007000D错误解决办法,亲测成功激活
  8. CentOS 7 host-only 设置上网
  9. Hibernate配置详细解释(转 )
  10. java中多个数字运算后值不对(失真)处理方法