function Plugin::dumpGeneratedServiceProviderData
1 call to Plugin::dumpGeneratedServiceProviderData()
- Plugin::preAutoloadDump in vendor/
tbachert/ spi/ src/ Composer/ Plugin.php
File
-
vendor/
tbachert/ spi/ src/ Composer/ Plugin.php, line 73
Class
Namespace
Nevay\SPI\ComposerCode
private function dumpGeneratedServiceProviderData(Event $event) : void {
$match = '';
foreach ($this->serviceProviders($event->getComposer(), $event->getIO()) as $service => $providers) {
if (!preg_match(self::FQCN_REGEX, $service)) {
$event->getIO()
->warning(sprintf('Invalid extra.spi configuration, expected class name, got "%s" (%s)', $service, implode(', ', array_unique($providers))));
continue;
}
if (!ServiceLoader::serviceAvailable($service)) {
$event->getIO()
->info(sprintf('Skipping extra.spi service "%s", service not available (%s)', $service, implode(', ', array_unique($providers))));
continue;
}
if ($service[0] !== '\\') {
$service = '\\' . $service;
}
$match .= "\n {$service}::class => [";
foreach ($providers as $provider => $package) {
if (!preg_match(self::FQCN_REGEX, $provider)) {
$event->getIO()
->warning(sprintf('Invalid extra.spi configuration, expected class name, got "%s" for "%s" (%s)', $provider, $service, $package));
continue;
}
if (!class_exists($provider)) {
$event->getIO()
->info(sprintf('Skipping extra.spi configuration, provider class "%s" for "%s" does not exist (%s)', $provider, $service, $package));
continue;
}
if (!ServiceLoader::providerAvailable($provider, skipRuntimeValidatedRequirements: true)) {
$event->getIO()
->info(sprintf('Skipping extra.spi provider "%s" for "%s", provider not available (%s)', $provider, $service, $package));
continue;
}
if ($provider[0] !== '\\') {
$provider = '\\' . $provider;
}
if ($condition = self::providerRuntimeValidatedRequirements($provider)) {
$match .= "\n ...(({$condition}) ? [";
$match .= "\n {$provider}::class, // {$package}";
$match .= "\n ] : []),";
}
else {
$match .= "\n {$provider}::class, // {$package}";
}
}
$match .= "\n ],";
}
$code = <<<PHP
<?php declare(strict_types=1);
namespace Nevay\\SPI;
/**
* @internal
*/
final class GeneratedServiceProviderData {
public const VERSION = 1;
/**
* @param class-string \$service
* @return list<class-string>
*/
public static function providers(string \$service): array {
return match (\$service) {
default => [],{<span class="php-variable">$match</span>}
};
}
}
PHP;
$filesystem = new Filesystem();
$vendorDir = $this->vendorDir($event->getComposer(), $filesystem);
$filesystem->ensureDirectoryExists($vendorDir . '/composer');
$filesystem->filePutContentsIfModified($vendorDir . '/composer/GeneratedServiceProviderData.php', $code);
$package = $event->getComposer()
->getPackage();
$autoload = $package->getAutoload();
$autoload['classmap'][] = $vendorDir . '/composer/GeneratedServiceProviderData.php';
$package->setAutoload($autoload);
}