Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 32 |
InstallerServiceProvider | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
12 | |
0.00% |
0 / 32 |
register | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 24 |
|||
alter | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 8 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Installer\InstallerServiceProvider. | |
*/ | |
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(array()); | |
$definition->setMethodCalls(array()); | |
$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 ModuleHandler::install()), so | |
// services are not actually persisted. | |
foreach ($container->findTaggedServiceIds('persist') as $id => $tags) { | |
$definition = $container->getDefinition($id); | |
$definition->clearTag('persist'); | |
} | |
} | |
} |