wake-up-neo.com

Wie werden ENV-Variablen in Laravel 5 richtig gesetzt?

In laravel 4 hatten wir:

$env = $app->detectEnvironment(array(
    'local' => array('Homestead')
));

standardmäßig.

Aber in laravel 5 wurde geändert in:

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});

Außerdem haben sie . Env. * Zeile in .gitignore ausgeschlossen, jetzt hat es:

.env

Und die Datei .env.example hinzugefügt:

APP_ENV=local
APP_KEY=SomeRandomString
DB_USERNAME=Homestead
DB_PASSWORD=Homestead

Wenn ich also mehr als zwei Umgebungen habe, muss ich jetzt alle in einer einzigen .env-Datei festlegen? Z.B.:

APP_ENV=local
DB_PASSWORD=123

APP_ENV=alpha
DB_PASSWORD=456

Wenn ich keine .env-Datei hätte, wie würde laravel wissen, welche Umgebung ich benutze?

29
Alexander Kim

Du kannst es genauso machen wie in Laravel 4:

$env = $app->detectEnvironment(array(
    'local' => array('Homestead')
));

*.env - Dateien werden nur zum Speichern vertraulicher Daten verwendet, die nicht in VCS gespeichert werden sollen. Das gleiche gilt für Laravel 4

aber es scheint, dass in den letzten Tagen Standard detectEnvironment geändert wurde:

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});

sie können also entweder eine Einstellungsvariable aus dem PC-Namen oder aus der ENV-Datei verwenden.

Wenn Sie die ENV-basierte Umgebungserkennung in der Haupt-ENV-Datei verwenden (standardmäßig .env), Müssen Sie Folgendes hinzufügen:

APP_ENV=local

Natürlich ist local hier eine lokale Umgebung, Sie können es in production oder dev ändern

Im Moment ist das wichtigste Problem, das ich sehe, dass Sie sich erinnern müssen, wenn Sie in Produktion gehen, um den Inhalt dieser .env - Datei von APP_ENV=local In APP_ENV=production Zu ändern, was meiner Meinung nach viel besser ist Methode ist die alte Standardmethode, die auf PC-Namen basiert.

Jetzt ENV-Dateien. Wenn Sie die ENV-basierte Umgebungserkennung verwenden, sollten Sie nur Folgendes in Ihre ENV-Datei einfügen:

APP_ENV=local

Jetzt können Sie separate ENV-Dateien für Ihre verschiedenen Umgebungen erstellen, zum Beispiel:

. local.env:

 MY_DB=testdb

. production.env:

MY_DB=productiondb

und jetzt in der bootstrap.environment.php Datei können Sie Folgendes ändern:

if (file_exists(__DIR__.'/../.env'))
{
    Dotenv::load(__DIR__.'/../');
}

in:

if (file_exists(__DIR__.'/../.env'))
{
    Dotenv::load(__DIR__.'/../');

    if (getenv('APP_ENV') && file_exists(__DIR__.'/../.' .getenv('APP_ENV') .'.env')) {
        Dotenv::load(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env');
    }   
}

um eine zusätzliche env-Datei basierend auf APP_ENV aus der Haupt-env-Datei zu laden.

Jetzt können Sie es wie immer in Ihrer anderen Konfigurationsdatei verwenden: $_ENV['MY_DB']

30

Für diejenigen, die gerade ein Upgrade auf 5.2 durchgeführt haben:

Sie können die statische Methode Dotenv::load() nicht mehr verwenden. Verwenden Sie stattdessen Folgendes:

$dotenv = new Dotenv\Dotenv(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env'); // Laravel 5.2
$dotenv->load();

in bootstrap/app.php.

// bearbeite Soo .. nachdem ich mich in der letzten Stunde damit beschäftigt habe, könnte ich hier auch ein paar zusätzliche Infos hinzufügen:

  • Laravel verwendet .env-Dateien zur Konfiguration
  • Standardmäßig wird die Datei ".env" im Stammverzeichnis der Anwendung geladen
  • Sie können auf die Werte in diesen .env-Dateien über die Hilfsfunktion env() oder direkt über die native Funktion getenv() von PHP zugreifen. Obwohl Sie dies nur tun sollten, um Ihre Konfigurationsdateien zu füllen (siehe /config/*.php), Weil diese können zwischengespeichert werden .
  • die ENV-Dateien werden in die Klasse DetectEnvironment geladen. Ich fand dies hilfreich beim Debuggen, um Haltepunkte zu setzen. Bitte beachten Sie die Zeile (new Dotenv($app->environmentPath(), $app->environmentFile()))->load();: Da load() verwendet wird, wird ein bereits eingestellter Umgebungswert nicht verwendet überschrieben! (Sie müssten overload() verwenden, um dies zu tun - dies brachte mich dazu verrückt weil Homestead den APP_ENV Variable zu local in der PHP-FPM-Konfiguration /etc/php/7.0/fpm/php-fpm.conf und Sie können es nicht über die .env-Datei ändern)
  • wenn Sie Unit-Tests schreiben, erben Sie normalerweise von TestCase , wodurch die Variable APP_ENV auf testing (über refreshApplication() gesetzt wird = - mit putenv() den voreingestellten local Wert überschreiben)
12
Hirnhamster

Ich wollte nur meine Lösung für Laravel 5.1, was meiner Meinung nach etwas einfacher ist. In bootstrap/app.php habe ich (direkt danach, wo die Anwendung instanziiert wird):

$app->beforeBootstrapping(\Illuminate\Foundation\Bootstrap\DetectEnvironment::class, function() use ($app) {
    $suffix = (env('APP_ENV')) 
        ? '.'.env('APP_ENV') 
        : '';
    $app->loadEnvironmentFrom('.env'.$suffix);
});

Es ist keine Überprüfung oder Fehlerbehandlung erforderlich. Laravel wird standardmäßig auf "production" gesetzt, wenn die Datei nicht gefunden wird.

Das ist alles.

1
thefuzzy0ne

Die Tatsache, dass Sie standardmäßig nicht mehr als eine .env - Datei haben können nd, dass sie in .gitignore ausgeschlossen ist, ist beabsichtigt und dient zum Verwalten von Umgebungen. Die Datei .env Sollte sich nicht in der Versionskontrolle befinden und sollte pro Umgebung konfiguriert werden. .env Legt Ihre Umgebung und alle Umgebungsvariablen fest.

Wenn ich also mehr als zwei Umgebungen habe, muss ich jetzt alle in einer einzigen .env-Datei festlegen?

Nein. Sie haben an jedem Ort, an dem Ihre Anwendung installiert ist, eine .env - Datei. Der Unterschied besteht darin, was sich in dieser Datei befindet.

Da es sich bei der Datei .env Lediglich um einen Schlüsselwertspeicher handelt, würden alle nachfolgenden Deklarationen vorherige überschreiben. In Ihrem Beispiel würde Laravel niemals Ihre "lokalen" Einstellungen sehen.

Es scheint auf den ersten Blick seltsam, aber dieses neue Standardsystem ist im Allgemeinen einfacher und weniger anfällig für die Probleme, die "4.2 way" hatte/hat, da es keinen Platz für logische Fehler gibt.

Wenn ich keine .env-Datei hätte, wie würde laravel wissen, welche Umgebung ich benutze?

Es würde überhaupt nicht laufen. In der .env - Datei befindet sich auch eine APP_KEY - Deklaration, ohne die Laravel nicht ausgeführt werden kann. Ohne eine .env - Datei erhalten Sie eine 500 Serverfehler.

0
Shauna