143 lines
4.0 KiB
PHP
143 lines
4.0 KiB
PHP
<?php
|
|
namespace nulib\app\config;
|
|
|
|
use nulib\app\app;
|
|
use nulib\app\config;
|
|
|
|
/**
|
|
* Class ProfileManager: gestionnaire de profils
|
|
*/
|
|
class ProfileManager {
|
|
/**
|
|
* @var string code du système dont on gère le profil
|
|
*
|
|
* ce code est utilisé pour dériver le nom du paramètre dans la configuration
|
|
* ainsi que la variable d'environnement depuis laquelle est chargée la valeur
|
|
* du profil
|
|
*/
|
|
const NAME = null;
|
|
|
|
/** @var array|null liste des profils valides */
|
|
const PROFILES = null;
|
|
|
|
/** @var array profils dont le mode production doit être actif */
|
|
const PRODUCTION_MODES = [
|
|
"prod" => true,
|
|
"test" => true,
|
|
];
|
|
|
|
/**
|
|
* @var array mapping profil d'application --> profil effectif
|
|
*
|
|
* ce mapping est utilisé quand il faut calculer le profil courant s'il n'a
|
|
* pas été spécifié par l'utilisateur. il permet de faire correspondre le
|
|
* profil courant de l'application avec le profil effectif à sélectionner
|
|
*/
|
|
const PROFILE_MAP = null;
|
|
|
|
function __construct(?array $params=null) {
|
|
$this->isAppProfile = $params["app"] ?? false;
|
|
$this->profiles = static::PROFILES;
|
|
$this->productionModes = static::PRODUCTION_MODES;
|
|
$this->profileMap = static::PROFILE_MAP;
|
|
$name = $params["name"] ?? static::NAME;
|
|
if ($name === null) {
|
|
$this->configKey = null;
|
|
$this->envKeys = ["APP_PROFILE"];
|
|
} else {
|
|
$configKey = "${name}_profile";
|
|
$envKey = strtoupper($configKey);
|
|
if ($this->isAppProfile) {
|
|
$this->configKey = null;
|
|
$this->envKeys = [$envKey, "APP_PROFILE"];
|
|
} else {
|
|
$this->configKey = $configKey;
|
|
$this->envKeys = [$envKey];
|
|
}
|
|
}
|
|
$this->defaultProfile = $params["default_profile"] ?? null;
|
|
$profile = $params["profile"] ?? null;
|
|
$productionMode = $params["production_mode"] ?? null;
|
|
$productionMode ??= $this->productionModes[$profile] ?? false;
|
|
$this->profile = $profile;
|
|
$this->productionMode = $productionMode;
|
|
}
|
|
|
|
/**
|
|
* @var bool cet objet est-il utilisé pour gérer le profil de l'application?
|
|
*/
|
|
protected bool $isAppProfile;
|
|
|
|
protected ?array $profiles;
|
|
|
|
protected ?array $productionModes;
|
|
|
|
protected ?array $profileMap;
|
|
|
|
protected function mapProfile(?string $profile): ?string {
|
|
return $this->profileMap[$profile] ?? $profile;
|
|
}
|
|
|
|
protected ?string $configKey;
|
|
|
|
function getConfigProfile(): ?string {
|
|
if ($this->configKey === null) return null;
|
|
return config::k($this->configKey);
|
|
}
|
|
|
|
protected array $envKeys;
|
|
|
|
function getEnvProfile(): ?string {
|
|
foreach ($this->envKeys as $envKey) {
|
|
$profile = getenv($envKey);
|
|
if ($profile !== false) return $profile;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
protected ?string $defaultProfile;
|
|
|
|
function getDefaultProfile(): ?string {
|
|
return $this->defaultProfile;
|
|
}
|
|
|
|
function setDefaultProfile(?string $profile): void {
|
|
$this->defaultProfile = $profile;
|
|
}
|
|
|
|
protected ?string $profile;
|
|
|
|
protected bool $productionMode;
|
|
|
|
protected function resolveProfile(): void {
|
|
$profile ??= $this->getenvProfile();
|
|
$profile ??= $this->getConfigProfile();
|
|
$profile ??= $this->getDefaultProfile();
|
|
if ($this->isAppProfile) {
|
|
$profile ??= $this->profiles[0] ?? "prod";
|
|
} else {
|
|
$profile ??= $this->mapProfile(app::get_profile());
|
|
}
|
|
$this->profile = $profile;
|
|
$this->productionMode = $this->productionModes[$profile] ?? false;
|
|
}
|
|
|
|
function getProfile(?bool &$productionMode=null): string {
|
|
if ($this->profile === null) $this->resolveProfile();
|
|
$productionMode = $this->productionMode;
|
|
return $this->profile;
|
|
}
|
|
|
|
function isProductionMode(): bool {
|
|
return $this->productionMode;
|
|
}
|
|
|
|
function setProfile(?string $profile=null, ?bool $productionMode=null): void {
|
|
if ($profile === null) $this->profile = null;
|
|
$profile ??= $this->getProfile($productionMode);
|
|
$productionMode ??= $this->productionModes[$profile] ?? false;
|
|
$this->profile = $profile;
|
|
$this->productionMode = $productionMode;
|
|
}
|
|
}
|