前言

在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"htmlcode">

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,和实际调用的类的实例之间的关系。

总结

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

标签:
laravel,服务提供者,laravel,门面模式,laravel,门面使用

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
狼山资源网 Copyright www.pvsay.com

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?