Skip to content

Feature Repository

github-actions[bot] edited this page Jul 16, 2026 · 1 revision

🗄️ Хранилище и адаптеры

← Возможности · Главная · Сравнение

Единый интерфейс поверх $_ENV/$_SERVER/putenv/массива с иммутабельностью по умолчанию — защита продакшн-окружения от подмены значений из файла.

Принцип работы

Repository объединяет несколько адаптеров-источников. Чтение возвращает значение из первого адаптера, где переменная найдена; запись идёт во все адаптеры. Иммутабельный режим запрещает перезапись уже заданных переменных.

Адаптер Источник
EnvConstAdapter $_ENV
ServerConstAdapter $_SERVER
PutenvAdapter getenv/putenv (влияет на дочерние процессы)
ArrayAdapter массив в памяти
use CloudCastle\Env\Repository\Repository;

$default  = Repository::default(immutable: true);  // $_ENV + $_SERVER + putenv
$isolated = Repository::inMemory();                // только память (для тестов)

Плюсы

  • Один интерфейс поверх четырёх источников.
  • Изолированное хранилище в памяти не трогает суперглобалы — идеально для тестов.
  • Иммутабельность по умолчанию — безопасность в проде.
  • delete() сообщает, существовала ли переменная (осмысленный результат clear()).

Минусы

  • PutenvAdapter влияет на дочерние процессы (proc_open, exec) — используйте осознанно.

✅ Рекомендуется

  • В тестах подменять хранилище изолированным: Env::setRepository(new Repository([new ArrayAdapter($fixture)], false)), затем Env::reset().
  • Оставлять иммутабельность включённой в продакшене.

❌ Антипаттерны

  • Писать секреты в PutenvAdapter при запуске недоверенных подпроцессов — они унаследуют окружение.
  • Отключать иммутабельность в проде без явной необходимости (overload).

Схема фичи

flowchart LR
    R[Repository] --> A1[EnvConstAdapter $_ENV]
    R --> A2[ServerConstAdapter $_SERVER]
    R --> A3[PutenvAdapter putenv]
    R --> A4[ArrayAdapter память]
    R -->|"чтение: первый с значением"| Read
    R -->|"запись: во все (если mutable)"| Write
Loading

Жизненный цикл

sequenceDiagram
    participant A as Приложение
    participant R as Repository
    A->>R: set(NAME, value)
    alt immutable и has(NAME)
        R-->>A: false (не перезаписано)
    else
        R->>R: write во все адаптеры
        R-->>A: true
    end
Loading

Сравнение с аналогами

Возможность Env vlucas symfony josegonzalez m1 devcoder 🏆 Победитель
Адаптеры $_ENV/$_SERVER/putenv ⚠️ 🔌 ⚠️ Env, vlucas
Иммутабельность Паритет
Изолированное хранилище в памяти Паритет

Clone this wiki locally