Wie ändere ich Variablen in der .env-Datei dynamisch in Laravel?

Lesezeit: 4 Minuten

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?

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

Wie andere ich Variablen in der env Datei dynamisch in Laravel
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

1643035445 167 Wie andere ich Variablen in der env Datei dynamisch in Laravel
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

.

619390cookie-checkWie ändere ich Variablen in der .env-Datei dynamisch in Laravel?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy