NormalInstallerServiceProvider.php

Same filename in other branches
  1. 8.9.x core/lib/Drupal/Core/Installer/NormalInstallerServiceProvider.php
  2. 10 core/lib/Drupal/Core/Installer/NormalInstallerServiceProvider.php
  3. 11.x core/lib/Drupal/Core/Installer/NormalInstallerServiceProvider.php

Namespace

Drupal\Core\Installer

File

core/lib/Drupal/Core/Installer/NormalInstallerServiceProvider.php

View source
<?php

namespace Drupal\Core\Installer;

use Drupal\Core\Cache\MemoryBackendFactory;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\DependencyInjection\ServiceProviderInterface;
use Drupal\Core\Lock\NullLockBackend;
use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass;
use Symfony\Component\DependencyInjection\Compiler\InlineServiceDefinitionsPass;
use Symfony\Component\DependencyInjection\Compiler\RemoveUnusedDefinitionsPass;
use Symfony\Component\DependencyInjection\Compiler\ReplaceAliasByActualDefinitionPass;
use Symfony\Component\DependencyInjection\Compiler\ResolveHotPathPass;
use Symfony\Component\DependencyInjection\Reference;

/**
 * Service provider for the installer environment.
 *
 * This class is manually added by install_begin_request() via
 * $conf['container_service_providers'] and optimizes the container for
 * installation.
 *
 * Note that the early installer environment requires the further customizations
 * in InstallerServiceProvider.
 *
 * @see install_begin_request()
 * @see \Drupal\Core\Installer\InstallerServiceProvider
 */
class NormalInstallerServiceProvider implements ServiceProviderInterface {
    
    /**
     * {@inheritdoc}
     */
    public function register(ContainerBuilder $container) {
        // Replace cache services with in-memory implementations. The results in
        // less queries to set caches which will only be cleared on the next module
        // install.
        $definition = $container->getDefinition('cache_factory');
        $definition->setClass(MemoryBackendFactory::class);
        $definition->setArguments([]);
        $definition->setMethodCalls([]);
        // Replace lock service with no-op implementation as Drupal installation can
        // only occur in a single thread and the site should not be publicly
        // available.
        $container->register('lock', NullLockBackend::class);
        // Remove the cache tags invalidator tag from the cache tags storage, so
        // that we don't call it when cache tags are invalidated in the installer.
        $container->getDefinition('cache_tags.invalidator.checksum')
            ->clearTag('cache_tags_invalidator');
        // Use performance-optimized extension lists.
        $container->getDefinition('extension.list.module')
            ->setClass(InstallerModuleExtensionList::class);
        $container->getDefinition('extension.list.theme')
            ->setClass(InstallerThemeExtensionList::class);
        $container->getDefinition('extension.list.theme_engine')
            ->setClass(InstallerThemeEngineExtensionList::class);
        // Don't register the lazy route provider in the super early installer.
        if (static::class === NormalInstallerServiceProvider::class) {
            $lazy_route_provider = $container->register('router.route_provider.installer');
            $lazy_route_provider->setClass(InstallerRouteProviderLazyBuilder::class)
                ->setDecoratedService('router.route_provider')
                ->addArgument(new Reference('router.route_provider.installer.inner'))
                ->addArgument(new Reference('router.builder'))
                ->addTag('event_subscriber');
        }
        $pass_config = $container->getCompilerPassConfig();
        $pass_config->setRemovingPasses(array_filter($pass_config->getRemovingPasses(), function ($pass) {
            // Remove InlineServiceDefinitionsPass, RemoveUnusedDefinitionsPass,
            // AnalyzeServiceReferencesPass and ReplaceAliasByActualDefinitionPass as
            // these are not necessary during installation.
            // @see \Symfony\Component\DependencyInjection\Compiler\PassConfig
            return !($pass instanceof InlineServiceDefinitionsPass || $pass instanceof RemoveUnusedDefinitionsPass || $pass instanceof AnalyzeServiceReferencesPass || $pass instanceof ReplaceAliasByActualDefinitionPass);
        }));
        $pass_config->setAfterRemovingPasses(array_filter($pass_config->getAfterRemovingPasses(), function ($pass) {
            // Remove ResolveHotPathPass as Drupal's container dumper does not support
            // it.
            // @see \Symfony\Component\DependencyInjection\Compiler\PassConfig
            return !$pass instanceof ResolveHotPathPass;
        }));
    }

}

Classes

Title Deprecated Summary
NormalInstallerServiceProvider Service provider for the installer environment.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.