diff --git a/core/lib/Drupal/Core/Extension/module.api.php b/core/lib/Drupal/Core/Extension/module.api.php index 60e35eecf2a2b7f58f75d531f4a180b755713795..582ba318d7d4b7e818e108fd21904574f14c795e 100644 --- a/core/lib/Drupal/Core/Extension/module.api.php +++ b/core/lib/Drupal/Core/Extension/module.api.php @@ -1022,6 +1022,29 @@ function hook_requirements($phase) { return $requirements; } +/** + * Alters requirements data. + * + * Implementations are able to alter the title, value, description or the + * severity of certain requirements defined by hook_requirements() + * implementations or even remove such entries. + * + * @param array $requirements + * The requirements data to be altered. + * + * @see hook_requirements() + */ +function hook_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 warning. + $requirements['update status']['severity'] = REQUIREMENT_INFO; + + // Remove a requirements entry. + unset($requirements['foo']); +} + /** * @} End of "addtogroup hooks". */ diff --git a/core/modules/system/src/SystemManager.php b/core/modules/system/src/SystemManager.php index d8fc9d36ee4c5bf06bafe0c506dcb12e0107c182..7c88d95c3e7785b82193619dcb5835b0f3dd9564 100644 --- a/core/modules/system/src/SystemManager.php +++ b/core/modules/system/src/SystemManager.php @@ -107,6 +107,7 @@ public function listRequirements() { // Check run-time requirements and status information. $requirements = $this->moduleHandler->invokeAll('requirements', ['runtime']); + $this->moduleHandler->alter('requirements', $requirements); uasort($requirements, function ($a, $b) { if (!isset($a['weight'])) { if (!isset($b['weight'])) { diff --git a/core/modules/system/tests/modules/requirements1_test/requirements1_test.install b/core/modules/system/tests/modules/requirements1_test/requirements1_test.install index e8121617adc38393509c67fd4abb6e8fbc28537e..611d2d49b87eb6766d5ff025c82d91e318d10e15 100644 --- a/core/modules/system/tests/modules/requirements1_test/requirements1_test.install +++ b/core/modules/system/tests/modules/requirements1_test/requirements1_test.install @@ -20,5 +20,17 @@ function requirements1_test_requirements($phase) { ]; } + $requirements['requirements1_test_alterable'] = [ + 'title' => t('Requirements 1 Test Alterable'), + 'severity' => REQUIREMENT_ERROR, + 'description' => t('A requirement that will be altered.'), + ]; + + $requirements['requirements1_test_deletable'] = [ + 'title' => t('Requirements 1 Test Deletable'), + 'severity' => REQUIREMENT_INFO, + 'description' => t('A requirement that will be deleted.'), + ]; + return $requirements; } diff --git a/core/modules/system/tests/modules/requirements1_test/requirements1_test.module b/core/modules/system/tests/modules/requirements1_test/requirements1_test.module new file mode 100644 index 0000000000000000000000000000000000000000..615c578df32907e6b76f0e1be7018835713b11ae --- /dev/null +++ b/core/modules/system/tests/modules/requirements1_test/requirements1_test.module @@ -0,0 +1,18 @@ +<?php + +/** + * @file + * Hook implementations for requirements1_test module. + */ + +/** + * Implements hook_requirements_alter(). + */ +function requirements1_test_requirements_alter(array &$requirements): void { + // Change the title. + $requirements['requirements1_test_alterable']['title'] = t('Requirements 1 Test - Changed'); + // Decrease the severity. + $requirements['requirements1_test_alterable']['severity'] = REQUIREMENT_WARNING; + // Delete 'requirements1_test_deletable', + unset($requirements['requirements1_test_deletable']); +} diff --git a/core/modules/system/tests/src/Kernel/Module/RequirementsTest.php b/core/modules/system/tests/src/Kernel/Module/RequirementsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..f44442417fd236c4cd6718880be2febed1583f5e --- /dev/null +++ b/core/modules/system/tests/src/Kernel/Module/RequirementsTest.php @@ -0,0 +1,33 @@ +<?php + +namespace Drupal\Tests\system\Kernel\Module; + +use Drupal\KernelTests\KernelTestBase; + +/** + * @covers \hook_requirements + * @covers \hook_requirements_alter + * @group Module + */ +class RequirementsTest extends KernelTestBase { + + /** + * {@inheritdoc} + */ + protected static $modules = [ + 'requirements1_test', + 'system', + ]; + + /** + * Tests requirements data altering. + */ + public function testRequirementsAlter(): void { + $requirements = $this->container->get('system.manager')->listRequirements(); + // @see requirements1_test_requirements_alter() + $this->assertEquals('Requirements 1 Test - Changed', $requirements['requirements1_test_alterable']['title']); + $this->assertEquals(REQUIREMENT_WARNING, $requirements['requirements1_test_alterable']['severity']); + $this->assertArrayNotHasKey('requirements1_test_deletable', $requirements); + } + +}