Skip to content

Configuration

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

Конфигурация

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

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

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

// Хранилище по умолчанию: $_ENV + $_SERVER + putenv, иммутабельное
$repository = Repository::default(immutable: true);

// Изолированное хранилище в памяти (для тестов)
$isolated = Repository::inMemory();

// Произвольный набор адаптеров
$custom = new Repository([new ArrayAdapter(['APP_ENV' => 'prod'])], immutable: false);

Иммутабельность

По умолчанию хранилище иммутабельно: уже заданные переменные не перезаписываются при загрузке .env. Это защищает системное окружение от подмены из файла.

use CloudCastle\Env\Dotenv;

Dotenv::createImmutable(__DIR__ . '/.env')->load();  // не перезапишет существующие
Dotenv::createMutable(__DIR__ . '/.env')->load();    // перезапишет (overload)

Через фасад:

Env::load($path);      // иммутабельно
Env::overload($path);  // мутабельно, поверх окружения

Фильтры

Фильтры преобразуют имена переменных после разбора, до записи в хранилище.

use CloudCastle\Env\Dotenv;
use CloudCastle\Env\EnvParser;
use CloudCastle\Env\Repository\Repository;
use CloudCastle\Env\Filter\PrefixFilter;
use CloudCastle\Env\Filter\LowercaseKeyFilter;

$dotenv = new Dotenv(
    Repository::inMemory(),
    new EnvParser(),
    [__DIR__ . '/.env'],
    [new PrefixFilter('APP_'), new LowercaseKeyFilter()],
);

Встроенные фильтры: PrefixFilter, LowercaseKeyFilter, UppercaseKeyFilter, RemapKeysFilter, CallableFilter. Свой фильтр — реализация FilterInterface.

Подмена хранилища в тестах

use CloudCastle\Env\Env;
use CloudCastle\Env\Repository\Repository;
use CloudCastle\Env\Repository\Adapter\ArrayAdapter;

Env::setRepository(new Repository([new ArrayAdapter(['DB_PORT' => '5432'])], false));
// ... тест ...
Env::reset();  // вернуть хранилище по умолчанию

Clone this wiki locally