laravel门面与服务提供者区别

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)

好了,现在开始讲 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,和实际调用的类的实例之间的关系。

更多Laravel相关技术文章,请访问Laravel框架入门教程栏目进行学习!

以上就是laravel门面与服务提供者区别的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/110394.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月23日 08:17:19
下一篇 2025年11月23日 08:31:35

相关推荐

  • JS 开发人员的 Python 基础知识

    1.基本语法和数据类型 变量声明:不需要 var、let 或 const。只需命名变量即可。 x = 10 name = “python” 原始类型: int(整数)浮动(浮点)str(字符串)布尔(布尔值) 数据结构: 列表(就像 js 中的数组): numbers = [1, 2, 3] num…

    2025年12月13日
    000
  • 在 PyTorch 中展开

    请我喝杯咖啡☕ *备忘录: 我的帖子解释了 unflatten()。我的帖子解释了 flatten() 和 ravel()。我的帖子解释了 flatten()。 unflatten() 可以向零个或多个元素的一维或多个 d 张量添加零个或多个维度,得到零个或多个元素的一维或多个 d 张量,如下所示:…

    2025年12月13日
    000
  • 在 PyTorch 中展平

    请我喝杯咖啡☕ *备忘录: 我的帖子解释了 flatten() 和 ravel()。我的帖子解释了 unflatten()。 flatten() 可以通过从零个或多个元素的 0d 或多个 d 张量中选择维度来移除零个或多个维度,得到零个或多个元素的 1d 或多个 d 张量,如下所示: *备忘录: 初…

    2025年12月13日
    000
  • 如何在共享主机的子目录中托管 Laravel 项目而不在 URL 中暴露“/public”

    在共享主机上托管 laravel 项目时,一个常见的挑战是确保 url 不需要 /public 目录。这是在子目录中托管 laravel 应用程序同时保持 url 干净的分步指南。 第 1 步:将 laravel 项目上传到服务器 登录您的托管帐户并访问您的文件管理器。导航到 public_html…

    2025年12月13日
    000
  • 到 Django 还是 DjangoREST?

    Django 和 DjangoREST 是 Python 中的高级框架,可能会争论它们是否不同,所以它们是吗? DjangoREST 用于构建 API(应用程序编程接口),而 Django 用于 Web 应用程序。尽管如此,我们还是会得出结论,所以让我们进一步探索。姜戈是什么?它是一个遵循模型-视图…

    2025年12月13日
    000
  • Mastering Python’s __name__ and __main__: Understanding Script Execution and Module Imports

    介绍 python 的 name 和 main 是两个经常被误解的概念,它们在脚本的执行方式和模块的导入方式中发挥着至关重要的作用。在这篇文章中,我们将详细解释 name 和 main 的实际含义、它们为何如此重要,以及如何利用它们来编写更加模块化、可测试和可重用的代码。最后,您将熟悉这个基本概念,…

    2025年12月13日
    000
  • Migrar de SQLite a MySQL

    我自我介绍一下,我是 alfredo riveros,我已经学习编程多年了,我目前正在 río tercero 高等商学院学习软件开发高级技术员,下面我将描述我面临的挑战遇到了。 正如标题所说,我的目标是将 SQLite 数据库迁移到 MySQL,这是我正在学习的数据库主题中的一个作业。 我选择的数…

    2025年12月13日 好文分享
    000
  • Python 中 array=[] 和 array=None 的区别是什么?

    Python中的None 在Python中,array=[] 和 array=None 之间存在着区别。 array=[] 创建了一个空的列表,也就是一个不包含任何元素的序列。它是一个 list 类型,其 len() 为 0。你可以使用各种列表方法来操作它,例如追加元素、删除元素和访问元素。 相反,…

    2025年12月13日
    000
  • PyCharm 中如何正确读取文件?

    pycharm 读写文件时路径写法的区别 在 python 中,文件读写操作可以通过 open 函数实现。当使用 pycharm 等 python 开发工具时,在读取文件时路径写法略有不同。 这个问题中遇到的问题是,在 pycharm 中读取文件时显示文件不存在。这是因为路径写法不正确所致。 正确的…

    2025年12月13日
    000
  • Python 中的 `[]` 和 `None` 有什么区别?

    Python中的None 在Python中,数组可以创建为空列表,也可以赋值None。了解这两个操作之间的区别至关重要。 array = [] 创建一个空列表可以使用列表方法操作默认值为空元组() array = None 立即学习“Python免费学习笔记(深入)”; 赋值为NoneType类型不…

    2025年12月13日
    000
  • Python 中 array = [] 和 array = None 的区别是什么?

    Python中的None Python中,array = [] 和 array = None这两种赋值方式有着本质上的区别。 array = [] 这种赋值方式会创建一个空的列表,即array是一个指向空列表的引用。可以使用列表的方法对其进行操作,例如append、insert等。 立即学习“Pyt…

    2025年12月13日
    000
  • Python 中的 None 和 空列表:有什么区别?

    python中的变量类型:none和空列表 在python中,none和空列表是两个截然不同的变量类型,它们在使用和意义上都有很大差异。 空列表 空列表是用中括号定义的,内部没有元素,例如: 立即学习“Python免费学习笔记(深入)”; array = [] 空列表本质上是一个list对象,它具有…

    2025年12月13日
    000
  • Python 中的 None 和 空列表 []:如何选择合适的空值表示?

    python 中特殊值 none 的不同应用 在 python 中,使用 none 表示空值或不存在的值。在以下代码中,我们探讨了 none 与空列表 [] 之间的区别: array1 = []array2 = None array = []:空列表 array1 引用了一个空列表,它不包含任何元素…

    2025年12月13日
    000
  • Python中的多进程编程和多线程编程的区别是什么?

    Python中的多进程编程和多线程编程的区别是什么? 在Python中,多进程编程和多线程编程都是实现并行计算的方法。虽然它们都能同时运行多个任务,但其底层原理和使用方式却有所不同。 多进程编程是利用操作系统的多进程机制来实现并行计算的。在Python中,可以使用multiprocessing模块来…

    2025年12月13日
    000
  • Python中的迭代器和生成器的区别是什么?

    Python中的迭代器和生成器的区别是什么? 在Python编程中,迭代器(iterator)和生成器(generator)都是用于处理可迭代对象的工具。它们两者都可以用于遍历数据,但是在实现上却有一些不同之处。 迭代器是一个对象,它实现了迭代器协议(iterator protocol)。迭代器对象…

    2025年12月13日
    000
  • Python与PHP高效传递JSON数组:从多字符串到结构化解析实践

    本教程旨在解决python脚本向php返回多个json对象时,php端解析困难的问题。核心方案在于python脚本将所有独立的json数据聚合为一个列表,并统一序列化为单个json字符串输出。php接收该字符串后,通过两次`json_decode`操作,首先解析外部的json数组结构,然后遍历数组对…

    2025年12月13日
    000
  • php关联数组怎么增加一项_PHP向关联数组增加新键值对

    向PHP关联数组添加键值对有四种方法:一、方括号赋值(如$arr[‘city’]=’Beijing’);二、array_merge合并数组;三、+=运算符追加;四、array_push压入关联子数组(会改变结构)。 如果您需要向PHP关联数组中添加一个…

    2025年12月13日
    000
  • php将对象变成数组输出_php对象转数组格式化技巧【指南】

    PHP对象转数组有五种方法:一、类型强制转换,仅支持公有属性;二、get_object_vars()函数,只返回可访问公有属性;三、自定义递归toArray()方法,通过反射访问所有属性并递归处理嵌套对象;四、JSON编解码,要求属性可序列化且无资源等类型;五、Laravel Collection辅…

    2025年12月13日
    000
  • 利用OpenCart多店铺功能实现集中式站点管理

    opencart原生支持多店铺功能,允许在单一安装下管理多个独立的电子商务站点。这一特性彻底解决了在不同目录下部署多个opencart实例时面临的文件同步和维护难题,通过共享核心代码库和集中化后台管理,显著提升了多站点运营的效率与便捷性,避免了重复部署和手动更新的繁琐。 在管理多个电子商务网站时,尤…

    2025年12月13日
    000
  • PDO多条记录插入:正确处理数组参数的教程

    本教程详细讲解了在使用PHP PDO将数组数据批量插入MySQL数据库时常见的错误及正确方法。重点阐述了如何避免`bindParam`将数组转换为字符串导致的问题,并提供了在循环中通过`execute`方法传递参数的最佳实践,确保数据正确、高效地入库。 在使用PHP的PDO扩展与MySQL数据库交互…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信