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;
 | |
|   }
 | |
| }
 |