Service provider loading facility, inspired by Javas ServiceLoader
.
composer require tbachert/spi
Service provider implementations must provide a public zero-arguments constructor.
composer config --json --merge extra.spi.Namespace\\Service '["Namespace\\Implementation"]'
ServiceLoader::register('Namespace\Service', 'Namespace\Implementation');
Make sure to allow the composer plugin to be able to load service providers.
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) {}
}