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