【问题标题】:What is the difference between Framework Service Providers and Application Service Providers?框架服务提供者和应用服务提供者有什么区别?
【发布时间】:2021-11-18 17:04:03
【问题描述】:

在文件config/app.php 中有一个数组键'providers'。这包含不同的服务提供者。 Laravel 在这里分为:包服务提供者、应用服务提供者和框架服务提供者。

我只需要添加一个外部包(Spatie 权限)。在这里,我必须将 spatie PermissionServiceProvider 添加到此数组中。在哪里添加它并不重要,但我仍然想知道框架服务、应用程序服务和包服务之间的区别是什么。最后将Spatie\Permission\PermissionServiceProvider::class, 放在正确的位置。我使用 Laravel 8。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    所提及的服务提供商的分类仅与提供商的来源有关。所有服务提供商都以相同的方式工作,无论来源如何。以下是这些内容的细分:

    1. 应用程序服务提供者是您自己的提供者,通常位于 \App\Providers 命名空间中。 Laravel 样板应用程序默认带有 5 个(列出 here),它们是样板文件,因为它们提供基本的应用程序功能,但旨在由开发人员扩展和修改。

    2. 框架包提供者是 Laravel 附带的。它们通常位于 Illuminate 命名空间下,但确切的命名空间可能非常取决于它们的用途。这些通常提供关键的框架功能,不应删除或阻止其运行。

    3. 包服务提供商是源自 3rd 方包的服务提供商,例如来自 Spatie\Permission\PermissionServiceProvider::class 的 laravel 许可的服务提供商

    创建提供者

    可以使用命令创建应用程序提供者

    php artisan make:provider ProviderName
    

    这会在app/Providers 下创建一个新的提供者,但不会注册它。

    注册服务商

    应用程序和框架服务提供者(以及一些包服务提供者)在config/app.phpproviders 部分下注册。这允许开发人员控制它们运行的​​顺序。在 Laravel 5.5 之前,包服务提供者也需要在config/app.php注册。

    这些提供程序用于构建存储在bootstrap/cache 下的提供程序缓存,这是实际读取并用于引导 Laravel 的内容

    包自动发现

    自 Laravel 5.5 起,以下命令已添加到 Laravel

    php artisan package:discover
    

    此命令遍历供应商文件夹,查找 composer.json 中包含以下内容的部分:

    "extra": {
        "laravel": {
            "providers": [
                "PackageVendor\\PackageName\\ServiceProvider"
            ],
        }
    },
    

    这随后用于将其他提供程序添加到引导提供程序缓存中,而无需开发人员手动将它们添加到 config/app.php

    此命令设置为在 Laravel 样板应用程序中的 composer autoload-dump 之后运行,该应用程序通常在大多数作曲家操作之后运行。

    运行提供程序

    引导提供程序缓存中包含的所有提供程序都按照它们定义的顺序运行,首先对它们每个调用register,然后对它们每个调用boot

    延迟提供者

    有关延期提供者的信息可以在here 找到。简短的版本是,如果您的提供程序仅提供到服务容器的绑定,您可以仅在实际需要绑定时才推迟提供程序的运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 2017-03-05
      • 2012-07-07
      • 2023-03-28
      • 2010-11-11
      • 1970-01-01
      • 2019-03-30
      相关资源
      最近更新 更多