Как динамически изменять переменные в .env-файле в Laravel?

Я хочу создать веб-приложение Laravel, которое позволяет пользователю администратора изменять некоторые переменные (например, учетные данные базы данных) в файле .env с использованием веб-бэкэнд-системы. Но как сохранить изменения?

Solutions Collecting From Web of "Как динамически изменять переменные в .env-файле в Laravel?"

Для этого нет встроенного способа. Если вы действительно хотите изменить содержимое файла .env , вам придется использовать некоторую замену строк в сочетании с методами написания файлов PHP. Для некоторого вдохновения вы должны взглянуть на key:generate команду: KeyGenerateCommand.php :

 $path = base_path('.env'); if (file_exists($path)) { file_put_contents($path, str_replace( 'APP_KEY='.$this->laravel['config']['app.key'], 'APP_KEY='.$key, file_get_contents($path) )); } 

После того, как будет создан путь к файлу и будет проверено существование, команда просто заменяет APP_KEY=[current app key] на APP_KEY=[new app key] . Вы должны иметь возможность выполнять ту же замену строк другим переменным.
И последнее, но не менее важное: я просто хотел сказать, что это может быть не самая лучшая идея позволить пользователям изменить файл .env. Для большинства пользовательских настроек я бы рекомендовал хранить их в базе данных, однако это, очевидно, проблема, если сам параметр необходим для подключения к базе данных.

У меня была та же проблема, и я создал функцию ниже

 public static function changeEnvironmentVariable($key,$value) { $path = base_path('.env'); if(is_bool(env($key))) { $old = env($key)? 'true' : 'false'; } if (file_exists($path)) { file_put_contents($path, str_replace( "$key=".$old, "$key=".$value, file_get_contents($path) )); } } 

Еще одна реализация, если у вас есть что-то вроде:

A = B # это действительная запись

В вашем файле .env

 public function updateEnv($data = array()) { if (!count($data)) { return; } $pattern = '/([^\=]*)\=[^\n]*/'; $envFile = base_path() . '/.env'; $lines = file($envFile); $newLines = []; foreach ($lines as $line) { preg_match($pattern, $line, $matches); if (!count($matches)) { $newLines[] = $line; continue; } if (!key_exists(trim($matches[1]), $data)) { $newLines[] = $line; continue; } $line = trim($matches[1]) . "={$data[trim($matches[1])]}\n"; $newLines[] = $line; } $newContent = implode('', $newLines); file_put_contents($envFile, $newContent); }