一个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目录下的所有

laravel中facade serviceprovider的理解的更多相关文章

  1. 深入理解 Laravel 中 config 配置加载原理

    Laravel的配置加载其实就是加载config目录下所有文件配置.如何过使用php artisan config:cache则会把加载的配置合并到一个配置文件中,下次请求就不会再去加载config目 ...

  2. laravel中的Contracts, ServiceContainer, ServiceProvider, Facades关系

    Contracts, ServiceContainer, ServiceProvider, Facades  Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方 ...

  3. 理解Laravel中的pipeline

    理解Laravel中的pipeline suoga 关注  0.1 2015.09.08 00:00* 字数 1533 阅读 7151评论 8喜欢 24 pipeline在laravel的启动过程中出 ...

  4. laravel中的构造函数依赖注入理解

    laravel中的自动依赖注入是非常强大的,刚开始会疑惑为什么只要在构造函数中传入一个强制类型的变量(就是参数有类型限制)过去就行了? 通过查看源码即查阅资料发现其实这其中有一个php技术,就是反射技 ...

  5. Laravel 中使用 Repository 模式

    在本文中,我会向你展示如何在 Laravel 中从头开始实现 repository 设计模式.我将使用 Laravel 5.8.3 版,但 Laravel 版本不是最重要的.在开始写代码之前,你需要了 ...

  6. Laravel中的日志与上传

    PHP中的框架众多,我自己就接触了好几个.大学那会啥也不懂啥也不会,拿了一个ThinkPHP学了.也许有好多人吐槽TP,但是个人感觉不能说哪个框架好,哪个框架不好,再不好的框架你能把源码读上一遍,框架 ...

  7. Laravel中的队列处理

    Laravel中的队列处理 队列介绍 为什么要有消息队?这里先对其进行一个简单的介绍,方便还不了解的同学理解.在面向对象里,有一个很简单的概念--消息传递,而消息队列就可以在它上面扩展一下,把它说的更 ...

  8. 在Laravel中一步一步创建Packages

    首先要看一下Laravel官方文档,这是最新4.2的文档,假设想看中文的话点击此处,基本一样.这个github上的库setup-laravel4-package,也是一步一步介绍怎样创建一个包.并关联 ...

  9. Laravel 中缓存驱动的速度比较

    缓存是web开发中重要的一部分,我相信很多人和我一样,经常忽略这个问题. 随着工作经验的累积,我已经意识到缓存是多么的重要,这里我通过 Scotch 来解释一下它的重要性. 通过观察发现,Scotch ...

随机推荐

  1. 安卓ListView中CheckBox的使用(支持Item列表项的删除,全选,全不选)

    ListView 自身提供了 CheckBox 只需要添加一行代码 getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 但是这种实现 ...

  2. Fix SharePoint 2013 Site in Read only mode after an interrupted backup

    Problem When I was backing up SharePoint Site Collection Automatically with PowerShell and Windows T ...

  3. 文件处理-智能检测编码的工具(chardet)

    一.chardet使用方法 问:假如你不知道你要处理的文件是什么编码可怎么办呢? import chardet f = open('通讯录.txt',mode='rb') data = f.read( ...

  4. [转]Github 简明教程

    如果你是一枚Coder,但是你不知道Github,那么我觉的你就不是一个菜鸟级别的Coder,因为你压根不是真正Coder,你只是一个Code搬运工. 但是你如果已经在读这篇文章了,我觉的你已经知道G ...

  5. 转:zTree高级入门:如何通过扩展节点的属性来达到是否显示节点的删除编辑等图标(按钮)

    当我们在使用ztree树组件的节点编辑功能时,只要我们引入了ztree相关节点编辑的js脚本文件: <script type="text/javascript" src=”/ ...

  6. 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

    本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...

  7. Java操作XML的JAXB工具

    在java中操作XML的工作中中,比较方便的工具是JAXB(Java Architecture for XML Binding). 利用这个工具很方便生成XML的tag和Java类的对应关系.参照网上 ...

  8. [LeetCode] Shortest Word Distance I & II & III

    Shortest Word Distance Given a list of words and two words word1 and word2, return the shortest dist ...

  9. 反转链表(不改变指针)JAVA版

    class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } } public class So ...

  10. ImageView 最大bitmap 4096

    ImageView 最大bitmap 4096,超出不显示图片