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 相关文章推荐
PHP 判断变量类型实现代码
Oct 23 PHP
ThinkPHP验证码使用简明教程
Mar 05 PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 PHP
PHP安全上传图片的方法
Mar 21 PHP
php简单备份与还原MySql的方法
May 09 PHP
thinkphp3.2.3 分页代码分享
Jul 28 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
Sep 23 PHP
php fread读取文件注意事项
Sep 24 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
May 04 PHP
PHP删除数组中特定元素的两种方法
Feb 28 PHP
浅谈Laravel中的三种中间件的作用
Oct 13 PHP
详解PHP设计模式之依赖注入模式
May 25 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
php 网上商城促销设计实例代码
2012/02/17 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
2014/10/24 PHP
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
JQuery中getJSON的使用方法
2010/12/13 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
js中AppendChild与insertBefore的用法详细解析
2013/12/16 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
详解用场景去理解函数柯里化(入门篇)
2019/04/11 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
2019/06/05 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
python调用windows api锁定计算机示例
2014/04/17 Python
python/sympy求解矩阵方程的方法
2018/11/08 Python
Python之循环结构
2019/01/15 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
简历中自我评价分享
2013/10/09 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
员工安全承诺书
2014/05/22 职场文书
房地产营销活动策划方案
2014/09/15 职场文书
施工安全协议书范本
2014/09/26 职场文书
护士先进个人总结
2015/02/13 职场文书
2015年服务员工作总结
2015/04/08 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js