getDefinitions() as $definition) { $definitions[$definition->key] = $definition; } $settings = [ ...$settings, ...$provider->getProvidedSettings($definitions), ]; } /** @var array $map */ $map = []; foreach (array_reverse($settings) as $setting) { if (array_key_exists($setting->key, $map)) { continue; } $value = $setting->value; if ($setting->definition !== null && !$this->validateAndTransformValue($value, $setting->definition)) { continue; } $map[$setting->key] = $value; } return new Settings($map); } public function createSettingsFromFormData(array $settings, iterable $definitions): SettingsInterface { $definitionMap = []; foreach ($definitions as $definition) { $definitionMap[$definition->key] = $definition; } foreach ($settings as $key => $value) { $definition = $definitionMap[$key] ?? null; if ($definition === null) { throw new \RuntimeException('Unexpected setting ' . $key . ' is not defined', 1724067004); } if ($definition->readonly) { unset($settings[$key]); continue; } // @todo We should collect invalid values and report in the UI instead of ignoring them if (!$this->validateAndTransformValue($value, $definition)) { $value = $definition->default; } $settings[$key] = $value; } return new Settings($settings); } private function validateAndTransformValue(mixed &$value, SettingDefinition $definition): bool { if (!$this->settingsTypeRegistry->has($definition->type)) { throw new \RuntimeException('Setting type ' . $definition->type . ' is not defined.', 1712437727); } $type = $this->settingsTypeRegistry->get($definition->type); if (!$type->validate($value, $definition)) { return false; } $value = $type->transformValue($value, $definition); return true; } }