null, 'default_folder' => 'group-v1008', 'default_resource_pool' => 'resgroup-3002', 'default_datastore' => 'datastore-3004', 'name' => null, 'region' => null, 'tags' => [], ]; public function __construct(private readonly SettingRepositoryInterface $settings) { } /** @return array */ public function all(): array { $raw = $this->settings->getByKey(self::KEY); $data = is_string($raw) ? json_decode($raw, true) : []; return array_merge(self::DEFAULTS, is_array($data) ? $data : []); } public function get(string $field, mixed $default = null): mixed { return $this->all()[$field] ?? $default; } /** Merge-write a subset of fields. */ public function merge(array $patch): array { $merged = array_merge($this->all(), $patch); $this->settings->updateOrCreateByKey(self::KEY, [ 'value' => json_encode($merged, JSON_UNESCAPED_UNICODE), ]); return $merged; } public function setActiveVcenterId(?int $id): void { $this->merge(['active_vcenter_id' => $id]); } public function defaultFolder(): string { return (string) $this->get('default_folder', self::DEFAULTS['default_folder']); } public function defaultResourcePool(): string { return (string) $this->get('default_resource_pool', self::DEFAULTS['default_resource_pool']); } public function defaultDatastore(): string { return (string) $this->get('default_datastore', self::DEFAULTS['default_datastore']); } }