以 Laravel 自带的文件系统为例,在 config/app.php 的配置文件的 providers 数组中,注册了一个服务提供者:

IlluminateFilesystemFilesystemServiceProvider::class,

在 alias 数组中定义了一个门面:

‘File’ => IlluminateSupportFacadesFile::class,

通过这两个步骤,我们就可以非常方便的使用 Laravel 提供的文件系统相关的操作,而且调用形式很简洁,如:

File::exist($path),判断文件是否存在。

File::get($path, $lock = false),获取一个文件的内容。

File::append($path, $data),把内容追加到一个文件末尾。

File::files($directory),获取一个目录下所有文件。

那么这是如何做到的呢?下面分别讲一讲 Laravel 的服务提供者和门面模式。

服务提供者

先看看定义:

服务提供者是所有 Laravel 应用程序启动的中心所在。包括你自己的应用程序,以及所有的 Laravel 核心服务,都是通过服务提供者启动的。

在文件系统这个服务提供者中,位置 /vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemServiceProvider.php,register 方法可以看到绑定了一个单例:

protected function registerNativeFilesystem()
{$this->app->singleton('files', function () {return new Filesystem;});
}

这个单例是 Filesystem 这个类的单例模式。当然,这个服务提供者中也可以绑定其他的单例,或做更多的事情。我们这里只研究 File::exist() 这种调用方式的原理。

那么这样一来就有个 files 的单例,实际上是 Filesystem 这个类的实例。

此时,如果没有 Facade,也是可以调用到 Filesystem 这个实例的方法的,那就是这样调用:

app(‘files’)->exist($path)

好了,现在开始讲 Facade.

Facade 门面模式

先看下简介:

Facades /fəˈsäd/ 为应用程序的服务容器中可用的类提供了一个「静态」接口。Laravel 自带了许多的 facades,可以用来访问其几乎所有的服务。Laravel facades 就是服务容器里那些基类的「静态代理」,相比于传统的静态方法调用,facades 在提供更简洁且丰富的语法的同时,还有更好的可测试性和扩展性。

本文一开始讲到 alias 数组定义了一个 File,具体的类是

IlluminateSupportFacadesFile::class,

它的内容是:

class File extends Facade
{/*** Get the registered name of the component.** @return string*/protected static function getFacadeAccessor(){return 'files';}
}

它实际上返回了一个名称,注意这个名称 files,不就是刚刚绑定的单例模式的名称吗?没错。

这样一来,就可以使用 File 这个别名或者说门面,来调用这个 Filesystem 实例中的方法了。

通过本文,希望大家能够了解服务提供者,Facade,和实际调用的类的实例之间的关系。

(原文地址:https://blog.tanteng.me/2017/...)

Laravel 服务提供者和门面模式相关推荐

  1. Laravel核心解读 -- 外观模式

    外观模式 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加 ...

  2. 浅谈PHP设计模式的门面模式

    简介: 门面模式又称之为外观模式,属于结构型的设计模式. 用于为子系统中的一组接口提供一致的调用方案.门面模式定义了一个高层接口,引入门面角色之后,只需要直接与门面角色交互,降低了系统的耦合度. 适用 ...

  3. 一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式

    [网络配图] 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.设计 ...

  4. JAVA之门面模式概述

    门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式,要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得子系统更易于使用. 医 ...

  5. 14Facade(门面)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.接口隔离模式 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接(稳定)接口来隔离本来互相紧密关联 ...

  6. 三分钟学会《门面模式》

    前言 只有光头才能变强 回顾前面所写过的设计模式: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 策略模式原来就这么简单! 无论是面试还是个人的提升 ...

  7. 8、Python与设计模式--门面模式

    一.火警报警器(1) 假设有一组火警报警系统,由三个子元件构成:一个警报器,一个喷水器,一个自动拨打电话的装置.其抽象如下: class AlarmSensor:def run(self):print ...

  8. Java 门面模式 浅析

    Java中的门面模式,一般来说他的用途是隐藏一些不希望用户看到的东西,比如方法,变量,并且这些变量是不能够设置成私有的,因为在系统内部有些地方需要调用.在Tomcat的HttpServletReque ...

  9. 《javascript设计模式》笔记之第十章 和 第十一章:门面模式和适配器模式

    第十章:门面模式 一:门面模式的作用 简化已有的api,使其更加容易使用 解决浏览器的兼容问题 二:门面模式的本质 门面模式的本质就是包装已有的api来简化操作   三:门面模式的两个简单例子 下面这 ...

最新文章

  1. 【BZOJ2157】旅游
  2. 单片机找工作好找吗?不懂英语怎么学会单片机?
  3. javascript实现汉诺塔动画效果
  4. jQuery on()方法绑定动态元素的点击事件无响应的解决办法
  5. 推荐系统——矩阵分解FM
  6. 分布式面试 - 集群部署时的分布式 session 如何实现?
  7. Redis 开发与运维
  8. SK海力士收购英特尔NAND闪存业务已获韩国公平贸易委员会批准
  9. 珍稀干货!阿里 Web 音视频开发趟坑指南
  10. MATLAB解带未知参数的积分方程
  11. 月关“历史网络小说第一人”:第四届橙瓜网络文学奖十佳历史大神
  12. 江苏自考计算机专业,2021年江苏自考本科专业选择:计算机类专业前景如何?有哪些科目?...
  13. 技嘉主板前置面板没有声音的解决
  14. 数据分析(Python)入门—鸢尾植物数据集处理
  15. transformer论文研读
  16. 阿里面试其实也没想象中的那么难,秋招提前批4面拿到21K
  17. 大厂没有方法论(下)
  18. 科技新品 | 荣耀Magic3系列智能手机;iQOO 8系列高端旗舰手机;卡西欧两款G-SHOCK品牌防震手表新品...
  19. eclipse+java环境搭建
  20. centos docker部署swoft

热门文章

  1. android studio 项目迁移 gradle 不对导致的卡住解决方法
  2. Linux Bond 技术学习资料
  3. 英文文章如何进行略读
  4. zookeepr+kafka集群搭建(一)
  5. js 控制 获取 dropdownlist的值
  6. mybatis控制台打印执行的sql语句
  7. 实验 7:流类库与输入输出
  8. 一 WebService 简介
  9. Codeforces626B - Cards【模拟】
  10. BZOJ1795 : [Ioi2008]Pyramid Base 金字塔地基