什么是包
在 Laravel 中,包是为应用程序添加功能的 Composer 包。包大致分为两类:- 独立包 — 不依赖于 Laravel 的通用 PHP 库(例如:Carbon、Pest)
- Laravel 包 — 包含路由、控制器、视图、配置等与 Laravel 集成的功能包
编写包的测试时,可以使用 Orchestra Testbench。它可以像编写普通 Laravel 应用一样编写包的测试。
包的自动发现
Laravel 在安装包时,会读取composer.json 中的 extra.laravel 部分,并自动注册服务提供者和门面。
bootstrap/providers.php,包也会被自动加载。
关于该自动发现的实现方式,以及缓存何时会被重建,可参阅包自动发现的内部结构。
禁用自动发现
如果用户希望禁用特定包的自动发现,可以在应用程序的composer.json 中进行设置。
服务提供者的作用
服务提供者是包的入口。将视图、配置、迁移、路由等资源注册到 Laravel 的处理都集中在这里。 服务提供者继承Illuminate\Support\ServiceProvider,并包含 register 和 boot 两个方法。
配置文件的发布
publishes() — 发布文件
在boot 方法中调用 publishes(),用户就可以使用 vendor:publish 命令将配置文件复制到自己的应用中。
mergeConfigFrom() — 与默认值合并
在register 方法中使用 mergeConfigFrom(),即使用户未发布配置文件,也会使用包的默认值。
使用标签划分发布组
在publishes() 的第二个参数中指定标签,用户就可以选择性地发布所需的资源。
注册路由
使用loadRoutesFrom() 加载路由文件。当应用的路由缓存有效时,它会被自动跳过。
迁移的发布
使用publishesMigrations() 可以发布迁移文件。发布时 Laravel 会自动更新时间戳。
视图的发布
loadViewsFrom() — 注册视图
使用loadViewsFrom() 注册视图目录。通过第二个参数指定的命名空间,以 package::view 的形式引用视图。
resources/views/vendor/courier 目录,若不存在则使用包的视图目录。这样用户就可以自定义视图。
发布视图
注册 Blade 组件
如果包中包含组件,可以在boot 方法中注册。
翻译文件的发布
使用loadTranslationsFrom() 注册翻译文件。翻译通过 package::file.key 的形式引用。
loadJsonTranslationsFrom()。
注册命令
包的 Artisan 命令通过commands() 方法注册。通常只在控制台环境下注册。
集成到 optimize 命令
如果包拥有自己的缓存,可以通过optimizes() 方法集成到 php artisan optimize 和 php artisan optimize:clear。
向 about 命令添加信息
要向 php artisan about 的输出中添加包信息,可使用 AboutCommand::add()。
创建门面
使用门面可以将服务容器的绑定作为静态方法调用。1
创建服务类
2
创建门面类
继承
Illuminate\Support\Facades\Facade,并在 getFacadeAccessor() 中返回服务容器的绑定键。3
在服务提供者中绑定
4
在 composer.json 中注册
@method 注解,可以让 IDE 自动补全生效。
DeferrableProvider — 实现延迟加载
对于只向服务容器进行绑定的提供者,可以通过实现DeferrableProvider 接口来实现延迟加载。由于在服务实际被需要之前提供者不会被加载,因此可以提升应用的性能。
provides() 中列举的服务时,提供者才会被加载。
包的测试
单独测试包时可使用 Orchestra Testbench。它可以让你像在普通 Laravel 应用中一样编写包的测试。getPackageProviders() 以注册包的服务提供者。
发布到 Composer
以下是将包发布到 Packagist 的最佳实践。composer.json 的基本配置
相关页面
服务提供者
了解服务提供者的
register 与 boot 方法,以及延迟提供者的详细信息。版本兼容性管理
介绍应对 Laravel 与 PHP 大版本升级的策略,以及 GitHub Actions 的测试矩阵配置。