コンテンツにスキップ
Nibiru docsv0.9.2

レジストリ

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

Stable Reading time ~ 1 min Edit on GitHub

レジストリは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 になります。
$users = \Nibiru\Registry::getInstance()->loadModuleConfigByName('users');
$users->session_lifetime;
$users->password_min_length;
$users->allowed_roles; / array

モジュール自体では、この内容をセッターでラップする慣習があります。

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

セクション名を大文字にする理由は何ですか?

Section titled “セクション名を大文字にする理由は何ですか?”

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

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

Section titled “モジュールごとの複数の 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

レジストリと設定の使用タイミング

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

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

読み込まれたすべてのモジュールを一覧表示

Section titled “読み込まれたすべてのモジュールを一覧表示”
$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つ + オーバーレイを使用することをお勧めします。