tbachert / spi
服务提供者加载工具
v1.0.1
2024-09-13 20:09 UTC
Requires
- php: ^8.1
- composer-plugin-api: ^2.0
- composer/semver: ^1.0 || ^2.0 || ^3.0
Requires (Dev)
- composer/composer: ^2.0
- infection/infection: ^0.27.9
- phpunit/phpunit: ^10.5
- psalm/phar: ^5.18
README
服务提供者加载工具,受Java的ServiceLoader
启发。
安装
composer require tbachert/spi
使用方法
注册服务提供者
服务提供者实现必须提供一个公共的无参构造函数。
通过composer.json的extra.spi
注册
composer config --json --merge extra.spi.Example\\Service '["Example\\Implementation"]'
通过PHP注册
ServiceLoader::register(Example\Service::class, Example\Implementation::class);
将ServiceLoader::register()
调用转换为预编译映射
ServiceLoader::register()
调用可以通过设置extra.spi-config.autoload-files
为以下内容转换为预编译映射:
true
以处理所有autoload.files
(仅在仅使用autoload.files
进行服务提供者注册时使用),- 或一个注册服务提供者的文件列表。
composer config --json extra.spi-config.autoload-files true
从autoload.files
中删除过时的条目
默认情况下,注册服务提供者的extra.spi-config.autoload-files
文件将从autoload.files
中删除。此行为可以通过设置extra.spi-config.prune-autoload-files
为以下内容进行配置:
true
以删除所有extra.spi-config.autoload-files
文件从autoload.files
中,false
以保留所有autoload.files
条目,- 或一个应该从
autoload.files
中删除的文件列表。
应用程序作者
确保允许composer插件加载服务提供者。
composer config allow-plugins.tbachert/spi true
加载服务提供者
foreach (ServiceLoader::load('Namespace\Service') as $provider) { // ... }
处理无效的服务配置
$loader = ServiceLoader::load('Namespace\Service'); for ($it = $loader->getIterator(); $it->valid(); $it->next()) { try { $provider = $it->current(); } catch (ServiceConfigurationError) {} }