当前位置: 首页 > 后端技术 > PHP

Laravel服务提供者和门面模式

时间:2023-03-29 16:51:34 PHP

以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方法可以看到绑定了一个单例:protectedfunctionregisterNativeFilesystem(){$this->app->singleton('files',function(){returnnewFilesystem;});}这个单例就是Filesystem类的单例模式。当然这个服务提供者还可以绑定其他的单例,或者做更多的事情。我们这里只研究调用File::exist()的原理。然后是文件的单例,它实际上是Filesystem类的一个实例。这时候如果没有Facade,也可以调用Filesystem实例的方法,也就是这样调用:app('files')->exist($path)好了,说说Facade.Facade首先是门面模式。简介:Facades/f??s?d/为应用程序服务容器中可用的类提供一个“静态”接口。Laravel带有许多外观,可用于访问几乎所有的服务。Laravel外观是服务容器中基类的“静态代理”。与传统的静态方法调用相比,门面不仅提供了更简洁、更丰富的语法,而且具有更好的可测试性和可扩展性。在本文的开头,我们提到别名数组定义了一个文件。具体类为IlluminateSupportFacadesFile::class,其内容为:classFileextendsFacade{/***获取组件的注册名。**@returnstring*/受保护的静态函数getFacadeAccessor(){return'files';}}其实返回的是一个名字,注意名字文件,不就是刚刚绑定的单例模式的名字吗?这是正确的。这样就可以使用File的别名或者facade来调用这个Filesystem实例中的方法了。通过这篇文章,希望你能理解服务提供者、Facade和实际调用的类的实例之间的关系。(原文地址:https://blog.tanteng.me/2017/...)