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?
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']
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:
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 .(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)TestCase
, wodurch die Variable APP_ENV
auf testing (über refreshApplication()
gesetzt wird = - mit putenv()
den voreingestellten local
Wert überschreiben)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.
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.