diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php index b9f7b30613..08269fd400 100644 --- a/core/lib/Drupal/Core/DrupalKernel.php +++ b/core/lib/Drupal/Core/DrupalKernel.php @@ -621,6 +621,20 @@ public function discoverServiceProviders() { // Retrieve enabled modules and register their namespaces. if (!isset($this->moduleList)) { $extensions = $this->getConfigStorage()->read('core.extension'); + // If core.extension configuration does not exist and we're not in the + // installer itself, then we need to put the kernel into a pre-installer + // mode. The container should not be dumped because Drupal is yet to be + // installed. The installer service provider is registered to ensure that + // cache and other automatically created tables are not created if + // database settings are available. None of this is required when the + // installer is running because the installer has its own kernel and + // manages the addition of its own service providers. + // @see \Drupal\KernelTests\KernelTestBase::bootKernel() + if ($extensions === FALSE && !InstallerKernel::installationAttempted()) { + $this->allowDumping = FALSE; + $this->containerNeedsDumping = FALSE; + $GLOBALS['conf']['container_service_providers']['InstallerServiceProvider'] = 'Drupal\Core\Installer\InstallerServiceProvider'; + } $this->moduleList = isset($extensions['module']) ? $extensions['module'] : []; } $module_filenames = $this->getModuleFileNames(); diff --git a/core/modules/simpletest/src/KernelTestBase.php b/core/modules/simpletest/src/KernelTestBase.php index dc06c87086..10ddbbce11 100644 --- a/core/modules/simpletest/src/KernelTestBase.php +++ b/core/modules/simpletest/src/KernelTestBase.php @@ -216,6 +216,9 @@ protected function setUp() { if (file_exists($directory . '/settings.testing.php')) { Settings::initialize(DRUPAL_ROOT, $site_path, $class_loader); } + // Ensure to set the module list upfront to avoid setting the kernel into + // the pre-installer mode. + $this->kernel->updateModules([], []); $this->kernel->boot(); // Ensure database install tasks have been run. @@ -231,6 +234,9 @@ protected function setUp() { // prevents any services created during the first boot from having stale // database connections, for example, \Drupal\Core\Config\DatabaseStorage. $this->kernel->shutdown(); + // Ensure to set the module list upfront to avoid setting the kernel into + // the pre-installer mode. + $this->kernel->updateModules([], []); $this->kernel->boot(); // Save the original site directory path, so that extensions in the diff --git a/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingSettingsTest.php b/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingSettingsTest.php index f5fb5dc225..141f047a3c 100644 --- a/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingSettingsTest.php +++ b/core/tests/Drupal/FunctionalTests/Installer/InstallerExistingSettingsTest.php @@ -54,6 +54,17 @@ protected function prepareEnvironment() { mkdir($this->settings['settings']['config_sync_directory']->value, 0777, TRUE); } + /** + * Visits the interactive installer. + */ + protected function visitInstaller() { + // Should redirect to the installer. + $this->drupalGet($GLOBALS['base_url']); + // Ensure no database tables have been created yet. + $this->assertSame([], Database::getConnection()->schema()->findTables('%')); + $this->assertSession()->addressEquals($GLOBALS['base_url'] . '/core/install.php'); + } + /** * {@inheritdoc} */ diff --git a/core/tests/Drupal/KernelTests/KernelTestBase.php b/core/tests/Drupal/KernelTests/KernelTestBase.php index 9f19fe73cb..fef5e2311f 100644 --- a/core/tests/Drupal/KernelTests/KernelTestBase.php +++ b/core/tests/Drupal/KernelTests/KernelTestBase.php @@ -349,10 +349,11 @@ private function bootKernel() { $kernel = new DrupalKernel('testing', $this->classLoader, FALSE); $kernel->setSitePath($this->siteDirectory); // Boot a new one-time container from scratch. Ensure to set the module list - // upfront to avoid a subsequent rebuild. - if ($modules && $extensions = $this->getExtensionsForModules($modules)) { - $kernel->updateModules($extensions, $extensions); - } + // upfront to avoid a subsequent rebuild or setting the kernel into the + // pre-installer mode. + $extensions = $modules ? $this->getExtensionsForModules($modules) : []; + $kernel->updateModules($extensions, $extensions); + // DrupalKernel::boot() is not sufficient as it does not invoke preHandle(), // which is required to initialize legacy global variables. $request = Request::create('/');