Я хочу создать веб-приложение Laravel, которое позволяет пользователю администратора изменять некоторые переменные (например, учетные данные базы данных) в файле .env с использованием веб-бэкэнд-системы. Но как сохранить изменения?
Для этого нет встроенного способа. Если вы действительно хотите изменить содержимое файла .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); }