Рубрики
PHP

Чтение .env файла в PHP

Обычно, для подключения .env файла используют phpdotenv. Но, представим, что по каким-то причинам вы не хотите использовать такую зависимость и решаете использовать свою функцию.

Сразу скажу, функция не будет читать многострочные значения, тк я не придумал когда лично мне это может пригодиться.

Создаем функцию, которая может принимать в качестве параметра путь к файлу, при этом возвращать она ничего не будет:

function setEnvData( string $filePath = '' ): void {
    // ...
}

Для начала скажем, что если имя файла не задано, то мы считаем, что имя файла .env и он лежит в той же директории, из которой мы запускаем функцию.

if ( empty( $filePath ) ) {
    $filePath = '.env';
}

Далее следует проверить, существует ли файл и если нет, выкинуть исключение:

if ( ! file_exists( $filePath ) ) {
    throw new RuntimeException( 'Wrong file path.' );
}

Читаем содержимое файла:

$file = file_get_contents( $filePath );

Далее разбиваем строки на массив и избавляемся от пустых строк:

$data = array_filter( explode( PHP_EOL, $file ) );

Если в итоге массив получился пустым, выходим из функции:

if ( empty( $data ) ) {
    return;
}

Раз массив не пуст, перебираем:

foreach ( $data as $i => $line ) {
    // ...
}

Внутри цикла разделяем строку на ключ и значение. Так как мы знаем, что в .env файле значения указываются в формате key = value, используем знак равно, как разделитель, но так, чтобы в итоге получалось только 2 значения:

$data[ $i ] = array_map( 'trim', explode( '=', $line, 2 ) );

Теперь надо убедиться, что для ключа определено значение, хотя бы пустое. Попутно избавимся от кавычек, если значение в заключено в них:

if ( isset( $data[ $i ][1] ) ) {
    $data[ $i ][1] = trim( $data[ $i ][1], '"' );
} else {
    $data[ $i ][1] = '';
}

Когда значение для ключа получено, устанавливаем его в глобальную переменную:

$_ENV[ $data[ $i ][0] ] = $data[ $i ][1];

Функция готова. Теперь ее надо вызвать:

setEnvData();

Чтобы убедиться, что функция работает, создайте .env файл и укажите там какие-нибудь значения, например имя пользователя БД:

DATABASE_USER=root

Теперь, после вызова функции можно обращаться к глобальной переменной $_ENV и получать значение нужного ключа:

print_r( $_ENV['DATABASE_USER'] );
// выведется root

Полный листинг

function setEnvData( string $filePath = '' ): void {
	if ( empty( $filePath ) ) {
		$filePath = '.env';
	}
	if ( ! file_exists( $filePath ) ) {
		throw new RuntimeException( 'Wrong file path.' );
	}
	$file = file_get_contents( $filePath );
	$data = array_filter( explode( PHP_EOL, $file ) );
	if ( empty( $data ) ) {
		return;
	}
	foreach ( $data as $i => $line ) {
		$data[ $i ] = array_map( 'trim', explode( '=', $line, 2 ) );
		if ( isset( $data[ $i ][1] ) ) {
			$data[ $i ][1] = trim( $data[ $i ][1], '"' );
		} else {
			$data[ $i ][1] = '';
		}
		$_ENV[ $data[ $i ][0] ] = $data[ $i ][1];
	}
}

setEnvData();

print_r( $_ENV['DATABASE_USER'] );