Skip to content
Snippets Groups Projects
Unverified Commit 87982857 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3490842 by nicxvan, alexpott, dww, smustgrave: Create...

Issue #3490842 by nicxvan, alexpott, dww, smustgrave: Create hook_update_requirements() and hook_update_requirements_alter()
parent 5e0a4ce7
No related branches found
No related tags found
No related merge requests found
......@@ -52,8 +52,12 @@ function update_check_requirements() {
_update_fix_missing_schema();
// Check requirements of all loaded modules.
$requirements = \Drupal::moduleHandler()->invokeAll('requirements', ['update']);
$requirements = array_merge(
\Drupal::moduleHandler()->invokeAll('requirements', ['update']),
\Drupal::moduleHandler()->invokeAll('update_requirements')
);
\Drupal::moduleHandler()->alter('requirements', $requirements);
\Drupal::moduleHandler()->alter('update_requirements', $requirements);
$requirements += update_system_schema_requirements();
return $requirements;
}
......
......@@ -1275,6 +1275,66 @@ function hook_runtime_requirements_alter(array &$requirements): void {
unset($requirements['foo']);
}
/**
* Check requirements before running database updates.
*
* This hook is invoked when update.php is run and when database updates are
* triggered via the CLI.
*
* @return array
* An associative array where the keys are arbitrary but must be unique (it
* is suggested to use the module short name as a prefix) and the values are
* themselves associative arrays with the following elements:
* - title: The name of the requirement.
* - value: The current value (e.g., version, time, level, etc).
* - description: The description of the requirement/status.
* - severity: (optional) The requirement's result/severity level, one of:
* - REQUIREMENT_INFO: Has no effect during updates.
* - REQUIREMENT_OK: Has no effect during updates.
* - REQUIREMENT_WARNING: Displays a warning, user can choose to continue.
* - REQUIREMENT_ERROR: Displays an error message, user cannot continue
* until the problem is resolved.
* Defaults to REQUIREMENT_OK.
*/
function hook_update_requirements() {
$requirements = [];
// Test PHP version
$requirements['php'] = [
'title' => t('PHP'),
'value' => phpversion(),
];
if (version_compare(phpversion(), \Drupal::MINIMUM_PHP) < 0) {
$requirements['php']['description'] = t('Your PHP installation is too old. Drupal requires at least PHP %version.', ['%version' => \Drupal::MINIMUM_PHP]);
$requirements['php']['severity'] = REQUIREMENT_ERROR;
}
return $requirements;
}
/**
* Alters update requirements data.
*
* Implementations are able to alter the title, value, description or the
* severity of certain requirements defined by hook_requirements() and
* hook_update_requirements() implementations, or even remove such entries.
*
* @param array $requirements
* The requirements data to be altered.
*
* @see hook_update_requirements()
*/
function hook_update_requirements_alter(array &$requirements): void {
// Change the title from 'PHP' to 'PHP version'.
$requirements['php']['title'] = t('PHP version');
// Decrease the 'update status' requirement severity from warning to info.
$requirements['update status']['severity'] = REQUIREMENT_INFO;
// Remove a requirements entry.
unset($requirements['foo']);
}
/**
* @} End of "addtogroup hooks".
*/
name: 'Test Hook Update Requirements'
type: module
description: 'Support module for testing hook_update_requirements().'
package: Testing
version: VERSION
<?php
declare(strict_types=1);
namespace Drupal\module_update_requirements\Hook;
use Drupal\Core\Hook\Attribute\Hook;
use Drupal\Core\StringTranslation\StringTranslationTrait;
/**
* Hook implementations for module_update_requirements.
*/
class ModuleUpdateRequirementsHooks {
use StringTranslationTrait;
/**
* Implements hook_update_requirements().
*/
#[Hook('update_requirements')]
public function updateRequirements(): array {
return [
'test.update.error' => [
'title' => $this->t('UpdateError'),
'value' => $this->t('None'),
'description' => $this->t('Update Error.'),
'severity' => REQUIREMENT_ERROR,
],
'test.update.error.alter' => [
'title' => $this->t('UpdateError'),
'value' => $this->t('None'),
'description' => $this->t('Update Error.'),
'severity' => REQUIREMENT_ERROR,
],
];
}
/**
* Implements hook_update_requirements_alter().
*/
#[Hook('update_requirements_alter')]
public function updateRequirementsAlter(array &$requirements): void {
$requirements['test.update.error.alter'] = [
'title' => $this->t('UpdateWarning'),
'value' => $this->t('None'),
'description' => $this->t('Update Warning.'),
'severity' => REQUIREMENT_WARNING,
];
}
}
<?php
declare(strict_types=1);
namespace Drupal\KernelTests\Core\Updater;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\KernelTests\KernelTestBase;
/**
* Tests hook_update_requirements() and hook_update_requirements_alter().
*
* @group Hooks
*/
class UpdateRequirementsTest extends KernelTestBase {
use StringTranslationTrait;
/**
* Tests hook_update_requirements().
*/
public function testUpdateRequirements(): void {
require_once 'core/includes/update.inc';
\Drupal::service('module_installer')->install(['module_update_requirements']);
$testRequirements = [
'title' => $this->t('UpdateError'),
'value' => $this->t('None'),
'description' => $this->t('Update Error.'),
'severity' => REQUIREMENT_ERROR,
];
$requirements = update_check_requirements()['test.update.error'];
$this->assertEquals($testRequirements, $requirements);
$testAlterRequirements = [
'title' => $this->t('UpdateWarning'),
'value' => $this->t('None'),
'description' => $this->t('Update Warning.'),
'severity' => REQUIREMENT_WARNING,
];
$alterRequirements = update_check_requirements()['test.update.error.alter'];
$this->assertEquals($testAlterRequirements, $alterRequirements);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment