Ich möchte eine Laravel-Web-App erstellen, mit der ein Administrator einige Variablen (z. B. Datenbankanmeldeinformationen) in der .env-Datei mithilfe des Web-Backend-Systems ändern kann. Aber wie speichere ich die Änderungen?
Wie ändere ich Variablen in der .env-Datei dynamisch in Laravel?
Dafür gibt es keine eingebaute Möglichkeit. Wenn Sie wirklich den Inhalt der .env
-Datei müssen Sie eine Art String-Ersetzung in Kombination mit den PHP-Methoden zum Schreiben von Dateien verwenden. Zur Inspiration sollten Sie einen Blick auf die werfen key:generate
Befehl: 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)
));
}
Nachdem der Dateipfad aufgebaut und die Existenz überprüft wurde, ersetzt der Befehl einfach APP_KEY=[current app key]
mit APP_KEY=[new app key]
. Sie sollten in der Lage sein, die gleiche Zeichenfolgenersetzung mit anderen Variablen durchzuführen.
Zu guter Letzt wollte ich nur sagen, dass es vielleicht nicht die beste Idee ist, Benutzer die .env-Datei ändern zu lassen. Für die meisten benutzerdefinierten Einstellungen würde ich empfehlen, sie in der Datenbank zu speichern, dies ist jedoch offensichtlich ein Problem, wenn die Einstellung selbst erforderlich ist, um eine Verbindung zur Datenbank herzustellen.
-
Schlägt in meiner Fensterumgebung fehl. Irgendeine Lösung dafür.
– Schwarze Mamba
11. Dezember 18 um 18:06 Uhr
-
wenn ich debugge
$this->laravel['config'] gives error
es sagt Fehler beim Auswerten des Codes– Sami
9. Dezember 2020 um 7:27 Uhr
Noch eine weitere Implementierung, falls Sie so etwas haben wie:
A = B #Dies ist eine gültige Eingabe
In Ihrer .env-Datei
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);
}
Aktualisieren Sie Ericks Antwort unter Berücksichtigung von $old
Werte, die Sting-, Bool- und Nullwerte abdecken.
public static function changeEnvironmentVariable($key,$value)
{
$path = base_path('.env');
if(is_bool(env($key)))
{
$old = env($key)? 'true' : 'false';
}
elseif(env($key)===null){
$old = 'null';
}
else{
$old = env($key);
}
if (file_exists($path)) {
file_put_contents($path, str_replace(
"$key=".$old, "$key=".$value, file_get_contents($path)
));
}
}
Um die obige Antwort von Lukasgeiter und anderen zu erweitern, verwenden Sie Regex zum Abgleichen der .env
wäre besser, als anders app.key
, die einzufügende Variable .env
möglicherweise nicht in der config.
Unten ist der Code, den ich beim Experimentieren mit benutzerdefinierten handwerklichen Befehlen verwendet habe. Dieser Code generiert einen Schlüssel für die XChaCha-Verschlüsselung (XCHACHA_KEY=?????
):
$path = base_path('.env');
if (file_exists($path)) {
//Try to read the current content of .env
$current = file_get_contents($path);
//Store the key
$original = [];
if (preg_match('/^XCHACHA_KEY=(.+)$/m', $current, $original)) {
//Write the original key to console
$this->info("Original XChaCha key: $original[0]");
//Overwrite with new key
$current = preg_replace('/^XCHACHA_KEY=.+$/m', "XCHACHA_KEY=$b64", $current);
} else {
//Append the key to the end of file
$current .= PHP_EOL."XCHACHA_KEY=$b64";
}
file_put_contents($path, $current);
}
$this->info('Successfully generated new key for XChaCha');
Verwenden preg_match()
ermöglicht das Abrufen des ursprünglichen Schlüssels bei Bedarf, ermöglicht auch das Ändern des Schlüssels, selbst wenn der tatsächliche Wert nicht bekannt ist.
Ich hatte das gleiche Problem und habe die folgende Funktion erstellt
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)
));
}
}
-
$old könnte undefiniert sein
– sgotre
23. November 17 um 12:49 Uhr
BJ
public function setEnvironmentValue($key, $value) {
$path = $_SERVER['DOCUMENT_ROOT'] . '/.env';
if (file_exists($path)) {
if (getenv($key)) {
//replace variable if key exit
file_put_contents($path, str_replace(
"$key=" . getenv($key), "$key=" . $value, file_get_contents($path)
));
} else {
//set if variable key not exit
$file = file($path);
$file[] = "$key=" . $value;
file_put_contents($path, $file);
}
}
}
-
$old könnte undefiniert sein
– sgotre
23. November 17 um 12:49 Uhr
Gemeinschaft
Eine andere Option ist die Verwendung einer Konfigurationsdatei, anstatt den Inhalt in der zu ändern .env
Datei.
Legen Sie all dies in Konfigurationsdateien mit dem Namen like newfile.php
innerhalb der config
Ordner, wenn Sie eigentlich nichts ändern wollen .env
Inhalt, und behandeln Sie sie als Variablen-/Array-Elemente.
<?php
return [
'PUSHER_APP_ID' => "",
'PUSHER_APP_KEY' => "",
'PUSHER_APP_SECRET' => "",
'PUSHER_APP_CLUSTER' => "",
];
Und im Controller wie folgt abrufen / einstellen:
config(['newfile.PUSHER_APP_ID' => 'app_id_value']); //set
config('newfile.PUSHER_APP_ID'); //get
.