Обычно, для подключения .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'] );