MDL-66903 core: Introduce \core_component::reset to replace hacks

Traditionally we have done this using reflection and it would be better
to do this in a 'proper' fashion in case we ever need to change how it
works.
This commit is contained in:
Andrew Nicols
2024-07-15 12:22:19 +08:00
parent 39d46917bb
commit d36cf65ef3
3 changed files with 16 additions and 6 deletions
+11 -1
View File
@@ -274,7 +274,6 @@ class core_component {
return $file;
}
/**
* Initialise caches, always call before accessing self:: caches.
*/
@@ -399,6 +398,17 @@ class core_component {
}
}
/**
* Reset the initialisation of the component utility.
*
* Note: It should not be necessary to call this in regular code.
* Please only use it where strictly required.
*/
public static function reset(): void {
// The autoloader will re-initialise if plugintypes is null.
self::$plugintypes = null;
}
/**
* Are we in developer debug mode?
*
+3 -2
View File
@@ -79,8 +79,9 @@ abstract class advanced_testcase extends base_testcase {
// Reset global state after test and test failure.
$CFG = phpunit_util::get_global_backup('CFG');
$DB = phpunit_util::get_global_backup('DB');
// This is _hacky_. We need to reset the autoloader, and this is the only way to do so right now.
(new ReflectionProperty(\core_component::class, 'plugintypes'))->setValue(null, null);
// We need to reset the autoloader.
\core_component::reset();
}
if (isset($e)) {
+2 -3
View File
@@ -38,8 +38,7 @@ final class component_test extends advanced_testcase {
public function tearDown(): void {
parent::tearDown();
$plugintypes = new ReflectionProperty(\core_component::class, 'plugintypes');
$plugintypes->setValue(null, null);
\core_component::reset();
}
public function test_get_core_subsystems(): void {
@@ -959,7 +958,7 @@ final class component_test extends advanced_testcase {
// We have to override the dirroot and libdir, and then reset the plugintypes property.
$CFG->dirroot = $vfileroot->url();
$CFG->libdir = $vfileroot->url() . '/lib';
(new ReflectionProperty('core_component', 'plugintypes'))->setValue(null, null);
\core_component::reset();
// Existing classes do not break.
$this->assertTrue(