Laravel中服务提供者和门面模式的入门介绍
前端之家收集整理的这篇文章主要介绍了
Laravel中服务提供者和门面模式的入门介绍,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_4040@前言
@H
404_0@在laravel中,我们可能需要用到自己
添加的类时,可以建立一个
文件夹专门存放类
文件,也可以使用laravel的服务提供者的方式来使用。
@H_
404_0@这两者其实区别不大,主要是前者使用的话,会跟业务
代码产生依赖,想象一下,如果一个控制器之中引用了很多
自定义的类
文件的话,那么可以想像会产生多少依赖,所以我们可以使用服务提供者的方式,向laravel的容器内
注册类,这样的话,就能够在一个单独的
配置文件里面来管理依赖,逻辑和后期维护也会方便不少。
@H_
404_0@使用门面主要是可以不需要去实例化类,可以使用静态
方法的方式去访问类的
方法,用起来也比较方便,不过这样其实也有缺点,比如不能够直接
跳转到对应的
方法内部,也不能直观的去了解这个
方法的
用法,个人开发可能影响不大,不过如果团队开发的,其实用起来可能会让人有点晕晕的吧。
@H_
404_0@以 Laravel
自带的
文件系统为例,在 config/app.
PHP 的
配置文件的 providers 数组中,
注册了一个服务提供者:
<div class="jb51code">
<pre class="brush:
PHP;">
Illuminate\Filesystem\FilesystemServiceProvider::class,
@H_
404_0@在 alias 数组中定义了一个门面:
Illuminate\Support\Facades\File::class,
@H_
404_0@通过这两个步骤,我们就可以非常方便的使用 Laravel 提供的
文件系统相关的操作,而且
调用形式很简洁,如:
File::exist($path)
,判断文件是否存在。
File::get($path,$lock = false)
,获取一个文件的内容。
File::append($path,$data)
,把内容追加到一个文件末尾。
File::files($directory)
,获取一个目录下所有文件。
@H_
404_0@那么这是如何做到的呢?下面分别讲一讲 Laravel 的服务提供者和门面模式。
@H_
404_0@
服务提供者
@H_
404_0@先看看定义:
@H_
404_0@服务提供者是所有 Laravel 应用程序启动的中心所在。
包括你自己的应用程序,以及所有的 Laravel 核心服务,都是通过服务提供者启动的。
@H_
404_0@在
文件系统这个服务提供者中,位置 /vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemServiceProvider.
PHP,register
方法可以看到绑定了一个单例:
app->singleton('files',function () {
return new Filesystem;
});
}
@H_
404_0@这个单例是 Filesystem 这个类的单例模式。当然,这个服务提供者中也可以绑定其他的单例,或做更多的事情。我们这里只研究
File::exist()
这种
调用方式的原理。
@H_
404_0@那么这样一来就有个 files 的单例,实际上是 Filesystem 这个类的实例。
@H_
404_0@此时,如果没有 Facade,也是可以
调用到 Filesystem 这个实例的
方法的,那就是这样
调用:
exist($path)
@H_
404_0@好了,现在开始讲 Facade.
@H_
404_0@
Facade 门面模式
@H_
404_0@先看下简介:
@H_
404_0@Facades /fəˈsäd/ 为应用程序的服务容器中可用的类提供了一个「静态」接口。Laravel
自带了许多的 facades,可以用来访问其几乎所有的服务。Laravel facades 就是服务容器里那些基类的「静态代理」,相比于传统的静态
方法调用,facades 在提供更简洁且丰富的语法的同时,还有更好的可测试性和扩展性。
@H_
404_0@本文一开始讲到 alias 数组定义了一个 File,具体的类是
PHP;">
Illuminate\Support\Facades\File::class,
@H_
404_0@它的
内容是:
PHP;">
class File extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'files';
}
}
@H_
404_0@它实际上返回了一个
名称,注意这个
名称 files,不就是刚刚绑定的单例模式的
名称吗?没错。
@H_
404_0@这样一来,就可以使用 File 这个别名或者说门面,来
调用这个 Filesystem 实例中的
方法了。
@H_
404_0@通过本文,希望大家能够了解服务提供者,Facade,和实际
调用的类的实例之间的关系。
@H_
404_0@
总结
@H_
404_0@以上就是这篇
文章的全部
内容了,希望本文的
内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程之家的
支持。