3 namespace MediaWiki\Settings
;
6 use MediaWiki\Settings\Config\ConfigBuilder
;
7 use MediaWiki\Settings\Config\ConfigSchema
;
9 class DynamicDefaultValues
{
11 private ConfigSchema
$configSchema;
16 private $declarations;
19 * @param ConfigSchema $configSchema
21 public function __construct( ConfigSchema
$configSchema ) {
22 $this->configSchema
= $configSchema;
23 $this->declarations
= $this->configSchema
->getDynamicDefaults();
27 * Compute dynamic defaults for settings that have them defined.
29 * @param ConfigBuilder $configBuilder
33 public function applyDynamicDefaults( ConfigBuilder
$configBuilder ): void
{
34 $alreadyComputed = [];
36 foreach ( $this->declarations
as $key => $unused ) {
37 $this->computeDefaultFor( $key, $configBuilder, $alreadyComputed );
42 * Compute dynamic default for a setting, recursively computing any dependencies.
44 * @param string $key Name of setting
45 * @param ConfigBuilder $configBuilder
46 * @param array &$alreadyComputed Map whose keys are the names of settings whose dynamic
47 * defaults have already been computed
48 * @param array $currentlyComputing Ordered map whose keys are the names of settings whose
49 * dynamic defaults are currently being computed, for cycle detection.
51 private function computeDefaultFor(
53 ConfigBuilder
$configBuilder,
54 array &$alreadyComputed = [],
55 array $currentlyComputing = []
57 if ( !isset( $this->declarations
[ $key ] ) ||
isset( $alreadyComputed[ $key ] ) ) {
60 if ( isset( $currentlyComputing[ $key ] ) ) {
61 throw new LogicException(
62 'Cyclic dependency when computing dynamic default: ' .
63 implode( ' -> ', array_keys( $currentlyComputing ) ) . " -> $key"
67 $configBuilder->get( $key ) !==
68 $this->configSchema
->getDefaultFor( $key )
70 // Default was already overridden, nothing more to do
71 $alreadyComputed[ $key ] = true;
76 $currentlyComputing[ $key ] = true;
78 $callback = $this->declarations
[ $key ]['callback'];
79 $argNames = $this->declarations
[ $key ]['use'] ??
[];
82 foreach ( $argNames as $argName ) {
83 $this->computeDefaultFor(
89 $args[] = $configBuilder->get( $argName );
92 $configBuilder->set( $key, $callback( ...$args ) );
94 $alreadyComputed[ $key ] = true;