value) ?? $this->loadFromFileEnv() ?? $this->defaultValue(); } /** * Checks if an equivalent environment variable exists with the `_FILE` suffix. If so, it loads its value as a file, * reads it, and returns its contents. * This is useful when loading Shlink with docker compose and using secrets. * See https://docs.docker.com/compose/use-secrets/ */ private function loadFromFileEnv(): string|int|bool|null { $file = env(sprintf('%s_FILE', $this->value)); if ($file === null || ! is_file($file)) { return null; } $content = file_get_contents($file); return $content ? parseEnvVar($content) : null; } private function defaultValue(): string|int|bool|null { return match ($this) { self::MEMORY_LIMIT => '512M', self::TIMEZONE => date_default_timezone_get(), self::DEFAULT_SHORT_CODES_LENGTH => DEFAULT_SHORT_CODES_LENGTH, self::SHORT_URL_MODE => ShortUrlMode::STRICT->value, self::IS_HTTPS_ENABLED, self::AUTO_RESOLVE_TITLES => true, self::REDIRECT_APPEND_EXTRA_PATH, self::MULTI_SEGMENT_SLUGS_ENABLED, self::SHORT_URL_TRAILING_SLASH => false, self::DEFAULT_DOMAIN, self::BASE_PATH => '', self::CACHE_NAMESPACE => 'Shlink', self::REDIS_PUB_SUB_ENABLED, self::MATOMO_ENABLED, self::ROBOTS_ALLOW_ALL_SHORT_URLS => false, self::DB_NAME => 'shlink', self::DB_HOST => self::DB_UNIX_SOCKET->loadFromEnv(), self::DB_DRIVER => 'sqlite', self::DB_PORT => match (self::DB_DRIVER->loadFromEnv()) { 'postgres' => '5432', 'mssql' => '1433', default => '3306', }, self::MERCURE_INTERNAL_HUB_URL => self::MERCURE_PUBLIC_HUB_URL->loadFromEnv(), self::DEFAULT_QR_CODE_SIZE, => DEFAULT_QR_CODE_SIZE, self::DEFAULT_QR_CODE_MARGIN, => DEFAULT_QR_CODE_MARGIN, self::DEFAULT_QR_CODE_FORMAT, => DEFAULT_QR_CODE_FORMAT, self::DEFAULT_QR_CODE_ERROR_CORRECTION, => DEFAULT_QR_CODE_ERROR_CORRECTION, self::DEFAULT_QR_CODE_ROUND_BLOCK_SIZE, => DEFAULT_QR_CODE_ROUND_BLOCK_SIZE, self::QR_CODE_FOR_DISABLED_SHORT_URLS, => DEFAULT_QR_CODE_ENABLED_FOR_DISABLED_SHORT_URLS, self::DEFAULT_QR_CODE_COLOR, => DEFAULT_QR_CODE_COLOR, self::DEFAULT_QR_CODE_BG_COLOR, => DEFAULT_QR_CODE_BG_COLOR, self::RABBITMQ_ENABLED, self::RABBITMQ_USE_SSL => false, self::RABBITMQ_PORT => 5672, self::RABBITMQ_VHOST => '/', self::REDIRECT_STATUS_CODE => DEFAULT_REDIRECT_STATUS_CODE->value, self::REDIRECT_CACHE_LIFETIME => DEFAULT_REDIRECT_CACHE_LIFETIME, self::ANONYMIZE_REMOTE_ADDR, self::TRACK_ORPHAN_VISITS => true, self::DISABLE_TRACKING, self::DISABLE_IP_TRACKING, self::DISABLE_REFERRER_TRACKING, self::DISABLE_UA_TRACKING => false, default => null, }; } public function existsInEnv(): bool { return $this->loadFromEnv() !== null; } }