Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. Plugin.php

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

Plugin

Namespace

Nevay\SPI\Composer

Code

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

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal