zoukankan      html  css  js  c++  java
  • laravel门面与服务提供者区别

    laravel门面模式与服务提供者区别

    以 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 方法可以看到绑定了一个单例:

    protected function registerNativeFilesystem()
    
    {
    
        $this->app->singleton('files', function () {
    
            return new Filesystem;
    
        });
    
    }
    
       

    这个单例是 Filesystem 这个类的单例模式。当然,这个服务提供者中也可以绑定其他的单例,或做更多的事情。我们这里只研究 File::exist () 这种调用方式的原理。

    那么这样一来就有个 files 的单例,实际上是 Filesystem 这个类的实例。

    此时,如果没有 Facade,也是可以调用到 Filesystem 这个实例的方法的,那就是这样调用:

    app(‘files’)->exist($path)
    
       

    链接:https://pan.baidu.com/s/1v5gm7n0L7TGyejCmQrMh2g 提取码:x2p5

    免费分享,但是X度限制严重,如若链接失效点击链接或搜索加群 群号518475424

    好了,现在开始讲 Facade.

    Facade 门面模式

    先看下简介:

    Facades /fəˈsäd/ 为应用程序的服务容器中可用的类提供了一个「静态」接口。Laravel 自带了许多的 facades,可以用来访问其几乎所有的服务。Laravel facades 就是服务容器里那些基类的「静态代理」,相比于传统的静态方法调用,facades 在提供更简洁且丰富的语法的同时,还有更好的可测试性和扩展性。

    本文一开始讲到 alias 数组定义了一个 File,具体的类是

    IlluminateSupportFacadesFile::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&&MySQL详解】
    【PHP对XML文件的操作技术【完整版】】
    【PHP XML与dtd概述【完整版】】
    【PHP的异常处理【完整】】
    【PHP用户的错误日志】
    【PHP自定义显示系统级别的致命错误和用户级别的错误】
    【PHP数组的使用】
    【PHP构造方法和析构方法的使用】
    【php全局变量和静态变量、静态方法的使用方法】
    【mysql启动Innodb的方法】
  • 原文地址:https://www.cnblogs.com/it-3327/p/11743564.html
Copyright © 2011-2022 走看看