---
title: "レジストリ"
description: "モジュールが自動的に検出され、その設定が実行時のアクセスのためにキャッシュされる方法。"
---

**レジストリ**はNibiruのモジュール設定キャッシュです。起動時に`application/module/`配下のすべてのディレクトリを走査し、各モジュールの`settings/*.ini`を解析し、解析された設定を単一のアクセッサを通じて公開します。これを考えると、モジュールが互いに回転するための重力中心のようなものです。

## 発見の仕組み

`application/module/<name>/settings/`以下の各モジュールについて：

1. レジストリは `*.ini` に一致するファイルを反復します。
2. 各ファイルについて、まず **環境固有** のファイル名を試みます (`<base>.<env>.<ext>`、例: `users.production.ini`)；失敗した場合はベース名 (`users.ini`) を使用します。
3. これは `parse_ini_file($path, true)` (マルチセクション) を呼び出します。
4. モジュール名に一致する大文字のセクションを探します — `[USERS]`、`[CMS]`、`[ANALYTICS]`。
5. 解析されたキー/値ペアは、モジュール名でキー付けられた `\stdClass` になります。

## モジュールの設定を読み込む
```php
$users = \Nibiru\Registry::getInstance()->loadModuleConfigByName('users');
$users->session_lifetime;
$users->password_min_length;
$users->allowed_roles;        // array
```
モジュール自体では、この内容をセッターでラップする慣習があります。
```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;
    }
}
```
## セクション名を大文字にする理由は何ですか？

INIセクション名は通常大文字で記述されるようにして視覚的に区別されるようにします。レジストリはこれに期待しているため、`cms`というモジュールは`[CMS]`を探します。常に大文字を使用してください。

## モジュールごとの複数の INI ファイル

何も、モジュールの `settings/` フォルダに複数の INI ファイルを持つことを防ぐものはありません。レジストリはそれらすべてを解析し、`[<MODULE>]` に一致するものを同じ `\stdClass` にマージします。責任範囲を分割するのに役立ちます：
```
application/module/users/settings/
├── users.ini              # [USERS] base config
├── users.smtp.ini         # [USERS] mail-related keys
└── users.production.ini   # production override
```
## レジストリと設定の使用タイミング

| | `Config` | `Registry` |
|---|---|---|
| ソース | `settings.<env>.ini`（1つのファイル） | モジュールごとの INIs（複数のファイル） |
| スコープ | アプリケーション全体のフレームワーク設定 | モジュール固有の設定 |
| セクション | 混合（DATABASE、SETTINGS、ENGINE など） | モジュールごとに1つ |
| ルックアップ | `Config::getInstance()->getConfig()['DATABASE']['driver']` | `Registry::getInstance()->loadModuleConfigByName('users')` |

ドライバーを読み込む必要があるモジュールは `[DATABASE]` から `Config` を参照します。自身の `[USERS] session_lifetime` を読み込む必要があるモジュールは `Registry` を参照します。

## 読み込まれたすべてのモジュールを一覧表示
```php
$registry = \Nibiru\Registry::getInstance();
foreach ($registry->getModuleNames() as $name) {
    $cfg = $registry->loadModuleConfigByName($name);
    echo "$name → " . print_r($cfg, true) . "\n";
}
```
デバッグコントローラーや管理ダッシュボードで役立ちます。

## リロードの意味論

`Config`と同様に、Registryはリクエストごとに**一度**だけ初期化されるシングルトンです。モジュールのINIファイルを変更した場合は、新しい値を確認するためにはリクエストをリフレッシュする必要があります。Registryシングルトンには、本当にミドルリクエストで再読み込みが必要な場合に使用できる`destroy()`メソッドがありますが、通常のフローでは必要ありません。

## 一般的な落とし穴

- **セクション名がモジュールフォルダと一致しません。** フォルダ `users/`、期待されるセクションは `[USERS]` です。不一致 → 空の設定。
- **INIファイル拡張子。** 只有 `*.ini` が解析されます。`*.conf` や `*.config` ファイルは無視されます。
- **環境ファイルがベースファイルを黙って上書きします。** `users.production.ini` に `[USERS]` がある場合、`users.ini` を完全に上書きします — 結合されません。両方のファイルを同期させること、または1つ + オーバーレイを使用することをお勧めします。
