wiki.techinc.nl/includes/Settings/Config/ArrayConfigBuilder.php
Petr Pchelko 2932c3c92f GlobalConfigSink: don't double-prefix in setDefault
$this->set was calling the overridden method, so if it was
called from setDefault, we'd end up double-prefixing the config.

Change-Id: I5f912332cc69cb58bb71e87cd9f8154246b53232
2021-11-30 14:03:11 +00:00

56 lines
1.5 KiB
PHP

<?php
namespace MediaWiki\Settings\Config;
use Config;
use HashConfig;
use MediaWiki\Settings\SettingsBuilderException;
class ArrayConfigBuilder implements ConfigBuilder {
/** @var array */
protected $config = [];
public function set( string $key, $value, MergeStrategy $mergeStrategy = null ): ConfigBuilder {
if ( $mergeStrategy ) {
if ( !is_array( $value ) ) {
throw new SettingsBuilderException(
'Cannot merge non-array value of type {value_type} under {key}',
[
'value_type' => get_debug_type( $value ),
'key' => $key,
]
);
} elseif ( !array_key_exists( $key, $this->config ) ) {
// Optimization: If the $key is not set in the config at all, no need to merge.
$this->config[$key] = $value;
} elseif ( is_array( $this->config[$key] ) && !$this->config[$key] ) {
// Optimization: If the existing value is an empty array, no need to merge.
$this->config[$key] = $value;
} else {
$this->config[$key] = $mergeStrategy->merge( $this->config[$key] ?? [], $value );
}
return $this;
}
$this->config[$key] = $value;
return $this;
}
public function setDefault( string $key, $value, MergeStrategy $mergeStrategy = null ): ConfigBuilder {
if ( $mergeStrategy ) {
self::set( $key, $value, $mergeStrategy->reverse() );
} elseif ( !array_key_exists( $key, $this->config ) ) {
$this->config[$key] = $value;
}
return $this;
}
/**
* Build the configuration.
*
* @return Config
*/
public function build(): Config {
return new HashConfig( $this->config );
}
}