Laravel中服务提供者和门面模式的入门介绍


Posted in PHP onNovember 06, 2017

前言

在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 实例中的方法了。

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
通过ICQ网关发送手机短信的PHP源程序
Oct 09 PHP
dedecms 制作模板中使用的全局标记图文教程
Mar 11 PHP
Phpbean路由转发的php代码
Jan 10 PHP
php 分库分表hash算法
Nov 12 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 PHP
destoon调用discuz论坛中带图片帖子的实现方法
Aug 21 PHP
CI框架入门示例之数据库取数据完整实现方法
Nov 05 PHP
详解json在php中的应用
Sep 30 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
May 06 PHP
PHP7数组的底层实现示例
Aug 25 PHP
php中文语义分析实现方法示例
Sep 28 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
Nov 06 #PHP
使用 laravel sms 构建短信验证码发送校验功能
Nov 06 #PHP
PHP中危险的file_put_contents函数详解
Nov 04 #PHP
PHP回调函数概念与用法实例分析
Nov 03 #PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 #PHP
PHP空值检测函数与方法汇总
Nov 19 #PHP
使用PHPStorm+XDebug搭建单步调试环境
Nov 19 #PHP
You might like
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
PHP中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
PHP向浏览器输出内容的4个函数总结
2014/11/17 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
详解PHP swoole process的使用方法
2017/08/26 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
js no-repeat写法 背景不重复
2009/03/18 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
简单学习Python time模块
2016/04/29 Python
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
python入门教程之识别验证码
2017/03/04 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
TensorFlow高效读取数据的方法示例
2018/02/06 Python
Python对List中的元素排序的方法
2018/04/01 Python
在Python中使用gRPC的方法示例
2018/08/08 Python
Python 编程速成(推荐)
2019/04/15 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
自考毕业生自我鉴定
2013/11/04 职场文书
电大本科自我鉴定
2014/02/05 职场文书
爱我中华演讲稿
2014/05/20 职场文书
元旦晚会活动总结
2014/07/09 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书