在laravel中,我们可能需要用到自己添加的类时,可以建立一个文件夹专门存放类文件,也可以使用laravel的服务提供者的方式来使用。
这两者其实区别不大,主要是前者使用的话,会跟业务代码产生依赖,想象一下,如果一个控制器之中引用了很多自定义的类文件的话,那么可以想像会产生多少依赖,所以我们可以使用服务提供者的方式,向laravel的容器内注册类,这样的话,就能够在一个单独的配置文件里面来管理依赖,逻辑和后期维护也会方便不少。
使用门面主要是可以不需要去实例化类,可以使用静态方法的方式去访问类的方法,用起来也比较方便,不过这样其实也有缺点,比如不能够直接跳转到对应的方法内部,也不能直观的去了解这个方法的用法,个人开发可能影响不大,不过如果团队开发的,其实用起来可能会让人有点晕晕的吧。
以 Laravel 自带的文件系统为例,在 config/app.php 的配置文件的 providers 数组中,注册了一个服务提供者: Illuminate\Filesystem\FilesystemServiceProvider::class, 在 alias 数组中定义了一个门面: File' => Illuminate\Support\Facades\File::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,具体的类是
Illuminate\Support\Facades\File::class,
它的内容是:
class File extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor() {
return 'files';
}
}

它实际上返回了一个名称,注意这个名称 files,不就是刚刚绑定的单例模式的名称吗?没错。
这样一来,就可以使用 File 这个别名或者说门面,来调用这个 Filesystem 实例中的方法了。

Laravel中服务提供者和门面模式的更多相关文章

  1. laravel 中条件查询 function模式

    当需要条件查找时,可以使用下面的注入方法: //我要预约 yudoc_name yudoc_keshi yudoc_jibing yudoc_hospital 这是需要帅选的条件 public fun ...

  2. JS设计模式——10.门面模式

    门面模式 这是一种组织性的模式,它可以用来修改类和对象的接口,使其更便于使用.它可以让程序员过得更轻松,使他们的代码变得更容易管理. 门面模式有两个作用: 简化类的接口 消除与使用她的客户代码之间的耦 ...

  3. laravel php门面模式

    门面模式   理解3个概念: 1)Container的概念,laravel所有的服务都注册在container里面,至于如何注册,就是使用service provider   2)service pr ...

  4. PHP中实用的模式之【门面模式】

           author:胡旭个人博客        blog:http://www.ihuxu.com        欢迎关注~~~~ 对于一些逻辑稍微复杂的程序,很难避免出现在不某个类中无法访问 ...

  5. java设计模式之门面模式以及在java中作用

    门面模式在Tomcat中有多处使用,在Request和Response对象封装,从ApplicationContext到ServletContext封装中都用到了这种设计模式. 一个系统可以有几个门面 ...

  6. Laravel 中使用 Repository 模式

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

  7. 设计模式在实际业务应用中的介绍之3——外观或门面模式Facade对AOP装配业务工厂的应用

    在C#中实现的基于外观或门面模式打造的业务应用案例 以前一直没有想过写一些东西来把项目中用到的知识点及技术实现做一个归纳整理并分享出来.现在打算逐渐的把项目中的一些东西整理并分享出来,与大家共勉! 外 ...

  8. 深入 Laravel 内核之外观模式(门面模式)

    门面模式核心内容: 客户端与子系统的通信通过外观对象进行: 外观对象封装一系列子系统的具体对应方法,对客户端只需暴露一个单一的入口方法: 客户端通过访问外观对象即可调用子系统的基础方法,无需关心子系统 ...

  9. Laravel中路由怎么写(一)

    1.路由基本使用示例 1.1 默认示例 Laravel中所有路由定义在/app/Http/routes.php文件中,该文件默认定义了应用的首页路由: Route::get('/', function ...

随机推荐

  1. Spring之AOP操作术语说明

  2. wordpress点击中文tag标签出现404解决方案

    TypeCho转WordPress之后,发现点击中文tag出现404页面,也就是点击无效了.试了几种修改链接样式,都没效果.也尝试了各种网上找的3中方法: 第一种方法:打开 WP-include/cl ...

  3. poj3368 Frequent values(线段树)

    Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In ad ...

  4. 【题解】 [POI2012]FES-Festival (差分约束)

    懒得复制题面,戳我戳我 Question: (因为网上找不到好的翻译,这里简单复述一下) 告诉你\(m1+m2\)个约束条件,然后要你找出\(X_1-X_n\)这些数字,求满足要求的数列中不同的数字个 ...

  5. 5月14日 绿城育华NOIP巨石杯试卷解析

    [题外话] 感谢UBUNTU为保存程序做出贡献:https://paste.ubuntu.com : 感谢洛谷OJ的私人题库保存题面:https://www.luogu.org : 现在我的题解的所有 ...

  6. 【codevs4696】等差数列

    题目大意:给定 N 个整数组成的集合,向集合中添加一个整数,使得这 N+1 个整数组成等差数列,求这样的整数有多少个. 题解: 引理1:若原集合中只有一个元素,则有无数种可能. 引理2:若原集合中有且 ...

  7. (转)丢掉鼠标吧,使用最好用的eclipse快捷键

    背景:eclipse作为自己经常使用的一款开发工具,熟练运用,能够达到事半功倍的效果.下面这篇文章总结了一些平时经常要使用的快捷键,十分的方便. 介绍Eclipse快捷键的文章很多,但大多都不详细,且 ...

  8. AIO + ByteBufferQueue + allocateDirect 终于可以与NIO的并发性能达到一致。

    看到这个标题,你可能会惊讶,相比NIO,AIO不就是为了在高并发的情况下代替NIO的吗? 是的,没错,但是在并发不高的情况下,AIO的性能表现很多时候还不如NIO. 在一台机子上用ab进行并发压力测试 ...

  9. adb相关基础知识集锦

    Android单元测试adb shell am instrument -w adb shell dumpsys adb logcat介绍

  10. python---django初步了解以及安装(包括Django网页首次无法访问的原因及解决方法,以及在linux服务器上布置无法启动的原因)

    pip install Django 相关网站资源: Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是 ...