---
title: "Registre"
description: "Comment les modules sont automatiquement découverts et leurs configurations mises en cache pour un accès au moment de l'exécution."
---

Le **Registre** est le cache de configuration des modules de Nibiru. À l'initialisation, il parcourt chaque répertoire sous `application/module/`, analyse chaque fichier `settings/*.ini` des modules et expose la configuration analysée via un seul accesseur. Imaginez-le comme le centre gravitationnel qui maintient les modules en orbite les uns autour des autres.

## Comment fonctionne la découverte

Pour chaque module sous `application/module/<nom>/settings/` :

1. Le Registre parcourt les fichiers correspondant à `*.ini`.
2. Pour chacun, il tente d'abord le nom de fichier spécifique à l'environnement (`<base>.<env>.<ext>`, par exemple `users.production.ini`) ; sinon, il revient au nom de base (`users.ini`).
3. Il appelle `parse_ini_file($path, true)` (multi-section).
4. Il recherche une section nommée d'après le module, en majuscules — `[USERS]`, `[CMS]`, `[ANALYTICS]`.
5. Les paires clé/valeur analysées deviennent un `\stdClass` indexé par le nom du module.

## Lecture de la configuration d'un module
```php
$users = \Nibiru\Registry::getInstance()->loadModuleConfigByName('users');
$users->session_lifetime;
$users->password_min_length;
$users->allowed_roles;        // array
```
À l'intérieur du module lui-même, la convention est d'envelopper cela dans un mutateur :
```php
class Users extends ModuleAdapter implements IModule
{
    const CONFIG_MODULE_NAME = 'users';
    protected static \stdClass $usersRegistry;

    protected function setUsersRegistry(): void {
        self::$usersRegistry = Registry::getInstance()
            ->loadModuleConfigByName(self::CONFIG_MODULE_NAME);
    }

    public static function lifetime(): int {
        return (int) self::$usersRegistry->session_lifetime;
    }
}
```
## Pourquoi les noms des sections en majuscules ?

Les noms des sections INI sont généralement en majuscules pour les rendre visuellement distincts. Le Registre suppose cela, donc un module appelé `cms` recherche `[CMS]`. Toujours en majuscules.

## INI multi-module

Rien ne vous empêche d'avoir plus d'un fichier INI dans le dossier `settings/` d'un module. Le Registre les analyse tous et fusionne tout ce qui correspond à `[<MODULE>]` dans le même `\stdClass`. Utile pour diviser les préoccupations :
```
application/module/users/settings/
├── users.ini              # [USERS] base config
├── users.smtp.ini         # [USERS] mail-related keys
└── users.production.ini   # production override
```
## Quand utiliser le Registre par rapport à la Configuration

| | `Config` | `Registry` |
|---|---|---|
| Source | `settings.<env>.ini` (un seul fichier) | INIs par module (plusieurs fichiers) |
| Portée | configuration globale du framework | configuration spécifique au module |
| Sections | mixtes (DATABASE, SETTINGS, ENGINE…) | une par module |
| Recherche | `Config::getInstance()->getConfig()['DATABASE']['driver']` | `Registry::getInstance()->loadModuleConfigByName('users')` |

Un module qui a besoin de lire le pilote `[DATABASE]` se tourne vers `Config`. Un module qui a besoin de lire sa propre durée de vie de la session `[USERS]` se tourne vers `Registry`.

## Liste de tous les modules chargés
```php
$registry = \Nibiru\Registry::getInstance();
foreach ($registry->getModuleNames() as $name) {
    $cfg = $registry->loadModuleConfigByName($name);
    echo "$name → " . print_r($cfg, true) . "\n";
}
```
Utile dans un contrôleur de débogage ou un tableau de bord d'administration.

## Rechargement des sémantiques

Comme `Config`, le Registre est un singleton peuplé **une seule fois** par requête. Si vous modifiez le fichier INI d'un module, vous devez rafraîchir la requête pour voir les nouvelles valeurs. Il existe une méthode `destroy()` sur le singleton du Registre si vous avez vraiment besoin de recharger pendant la requête, mais dans les flux normaux, ce n'est pas nécessaire.

## Tracas courantes

- **Le nom de la section ne correspond pas au dossier du module.** Dossier `users/`, section attendue `[USERS]`. Mismatch → configuration vide.
- **Extension de fichier INI.** Seul `*.ini` est analysé. Un fichier `*.conf` ou `*.config` est ignoré.
- **Le fichier d'environnement écrase silencieusement le fichier de base.** Si `users.production.ini` existe avec `[USERS]`, il écrase complètement `users.ini` — pas fusionné. Gardez les deux fichiers synchronisés, ou utilisez un seul + une superposition.
