Mercurial > hg > isophonics-drupal-site
diff core/lib/Drupal/Core/Installer/InstallerServiceProvider.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 129ea1e6d783 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/lib/Drupal/Core/Installer/InstallerServiceProvider.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,84 @@ +<?php + +namespace Drupal\Core\Installer; + +use Drupal\Core\DependencyInjection\ContainerBuilder; +use Drupal\Core\DependencyInjection\ServiceProviderInterface; +use Drupal\Core\DependencyInjection\ServiceModifierInterface; +use Symfony\Component\DependencyInjection\Reference; + +/** + * Service provider for the early installer environment. + * + * This class is manually added by install_begin_request() via + * $conf['container_service_providers'] and required to prevent various services + * from trying to retrieve data from storages that do not exist yet. + */ +class InstallerServiceProvider implements ServiceProviderInterface, ServiceModifierInterface { + + /** + * {@inheritdoc} + */ + public function register(ContainerBuilder $container) { + // Inject the special configuration storage for the installer. + // This special implementation MUST NOT be used anywhere else than the early + // installer environment. + $container->register('config.storage', 'Drupal\Core\Config\InstallStorage'); + + // Replace services with in-memory implementations. + $definition = $container->getDefinition('cache_factory'); + $definition->setClass('Drupal\Core\Cache\MemoryBackendFactory'); + $definition->setArguments([]); + $definition->setMethodCalls([]); + $container + ->register('keyvalue', 'Drupal\Core\KeyValueStore\KeyValueMemoryFactory'); + $container + ->register('keyvalue.expirable', 'Drupal\Core\KeyValueStore\KeyValueNullExpirableFactory'); + + // Replace services with no-op implementations. + $container + ->register('lock', 'Drupal\Core\Lock\NullLockBackend'); + $container + ->register('url_generator', 'Drupal\Core\Routing\NullGenerator') + ->addArgument(new Reference('request_stack')); + $container + ->register('path_processor_manager', 'Drupal\Core\PathProcessor\NullPathProcessorManager'); + $container + ->register('router.dumper', 'Drupal\Core\Routing\NullMatcherDumper'); + + // Remove the cache tags invalidator tag from the cache tags storage, so + // that we don't call it when cache tags are invalidated very early in the + // installer. + $container->getDefinition('cache_tags.invalidator.checksum') + ->clearTag('cache_tags_invalidator'); + + // Replace the route builder with an empty implementation. + // @todo Convert installer steps into routes; add an installer.routing.yml. + $definition = $container->getDefinition('router.builder'); + $definition->setClass('Drupal\Core\Installer\InstallerRouteBuilder') + // The core router builder, but there is no reason here to be lazy, so + // we don't need to ship with a custom proxy class. + ->setLazy(FALSE); + } + + /** + * {@inheritdoc} + */ + public function alter(ContainerBuilder $container) { + // Disable Twig cache (php storage does not exist yet). + $twig_config = $container->getParameter('twig.config'); + $twig_config['cache'] = FALSE; + $container->setParameter('twig.config', $twig_config); + + // No service may persist when the early installer kernel is rebooted into + // the production environment. + // @todo The DrupalKernel reboot performed by drupal_install_system() is + // actually not a "regular" reboot (like ModuleInstaller::install()), so + // services are not actually persisted. + foreach ($container->findTaggedServiceIds('persist') as $id => $tags) { + $definition = $container->getDefinition($id); + $definition->clearTag('persist'); + } + } + +}