服务提供者加载工具

安装数: 5,509

依赖者: 4

推荐者: 2

安全: 0

星标: 1

关注者: 1

分支: 1

开放问题: 0

类型:composer-plugin

v1.0.1 2024-09-13 20:09 UTC

This package is auto-updated.

Last update: 2024-09-13 22:48:12 UTC


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) {}
}