Skip to content

包开发

简介

包是向 Laravel 添加功能的主要方式。包可以是任何东西,从处理日期的好方法(如 Carbon)到允许你将文件与 Eloquent 模型关联的包(如 Spatie 的 Laravel Media Library)。

有不同类型的包。有些包是独立的,意味着它们适用于任何 PHP 框架。Carbon 和 Pest 是独立包的例子。任何这些包都可以通过在 composer.json 文件中引入来与 Laravel 一起使用。

另一方面,其他包专门用于 Laravel。这些包可能有专门用于增强 Laravel 应用程序的路由、控制器、视图和配置。本指南主要涵盖那些 Laravel 特定包的开发。

关于门面的说明

在编写 Laravel 应用程序时,使用契约还是门面通常并不重要,因为两者都提供基本相同的可测试性级别。但是,在编写包时,你的包通常无法访问所有 Laravel 的测试辅助函数。如果你希望能够像包安装在典型 Laravel 应用程序中一样编写包测试,可以使用 Orchestral Testbench 包。

包发现

Laravel 应用程序的 bootstrap/providers.php 文件包含 Laravel 应该加载的服务提供者列表。但是,不需要用户手动将你的服务提供者添加到列表中,你可以在包的 composer.json 文件的 extra 部分定义提供者,以便 Laravel 自动加载它。除了服务提供者,你还可以列出你希望注册的任何门面

json
"extra": {
    "laravel": {
        "providers": [
            "Barryvdh\\Debugbar\\ServiceProvider"
        ],
        "aliases": {
            "Debugbar": "Barryvdh\\Debugbar\\Facade"
        }
    }
},

一旦你的包配置为发现,Laravel 将在安装时自动注册其服务提供者和门面,为你的包用户创建方便的安装体验。

退出包发现

如果你是包的消费者并希望禁用某个包的包发现,可以在应用程序的 composer.json 文件的 extra 部分列出包名称:

json
"extra": {
    "laravel": {
        "dont-discover": [
            "barryvdh/laravel-debugbar"
        ]
    }
},

你可以在应用程序的 dont-discover 指令中使用 * 字符禁用所有包的包发现:

json
"extra": {
    "laravel": {
        "dont-discover": [
            "*"
        ]
    }
},

服务提供者

服务提供者是你的包和 Laravel 之间的连接点。服务提供者负责将东西绑定到 Laravel 的服务容器并通知 Laravel 在哪里加载包资源,如视图、配置和语言文件。

服务提供者继承 Illuminate\Support\ServiceProvider 类并包含两个方法:registerboot。基础 ServiceProvider 类位于 illuminate/support Composer 包中,你应该将其添加到自己的包依赖中。要了解更多关于服务提供者的结构和目的,请查看它们的文档

资源

配置

通常,你需要将包的配置文件发布到应用程序的 config 目录。这将允许你的包用户轻松覆盖你的默认配置选项。要允许发布你的配置文件,从服务提供者的 boot 方法调用 publishes 方法:

php
/**
 * 引导任何包服务。
 */