it-swarm.com.de

Umgebungsgesteuerte Datenbankeinstellungen in Laravel?

Ich bewege mich über das Laravel-Framework, habe aber Probleme mit den Datenbankeinstellungen.

Im Besonderen habe ich meine Umgebungen eingerichtet und sie funktionieren gut für die Konfigurationsdatei application.php, jedoch scheint die Konfigurationsdatei database.php keine Auswirkung zu haben.

Selbst wenn ich eine config.-Datei database.php in meinem Umgebungsordner habe, wird sie nie geladen. Ich füge eine Reihe ungültiger Zeichen (Keyboard-Mash) in die Datei ein, damit PHP einen Fehler auslöst, aber es wird nie getroffen.

Unterstützt Laravel keine umgebungsbasierten Datenbankeinstellungen? oder mache ich das falsch?

45
Hailwood

Sie können die Datenbankeinstellungen (und jede andere Konfigurationseinstellung) auf jeden Fall nach Umgebung festlegen.

Für Laravel 3 (für Laravel 4 und Laravel 5 siehe unten):

Erstens - Sie müssen $environments in Ihrem paths.php definieren und auf etwa Folgendes einstellen:

$environments = array(
  'development' => array('*.dev'),
  'production' => array('*.com'),
);

Laravel sucht automatisch nach dieser Variablen und verwendet, falls gesetzt, die zugehörige Konfiguration.

Normalerweise haben Sie einen config-Ordner mit Einstellungen wie database.php und auth.php

Erstellen Sie nun einfach einen neuen Ordner für jeden Laravel_Env, den Sie verwenden möchten (z. B. Entwicklung). Sie erhalten am Ende eine Ordnerstruktur wie diese.

/application
  /config
    /development
      database.php
    /production
      database.php
    application.php
    config.php
    database.php
    ...
    user_agents.php

Sie werden feststellen, dass in jedem Unterordner nur database.php enthalten ist. Laravel lädt immer zuerst die Standardkonfigurationseinstellungen und überschreibt sie dann mit den benutzerdefinierten Konfigurationen der Umgebungseinstellungen.

Schließlich hätten Sie in Ihrer Entwicklungs-/Datenbankdatei so etwas;

<?php
 return array(
'default' => 'mysql'
 );

ps. Ich habe das gerade mit dem aktuellen Laravel-Build 3.2.12 getestet - und es funktioniert definitiv.

Bonus-Tipp: Sie können auch automatisch eine Umgebung für Artisan festlegen, sodass Sie die Umgebung nicht manuell in jede Befehlszeile aufnehmen müssen! Um dies zu tun:

  1. Sie müssen Ihren "Hostnamen" kennen, auf dem Sie Artisan ausführen. Um dies herauszufinden, bearbeiten Sie vorübergehend den artisan.php in Ihrem Stammordner und fügen Sie var_dump(gethostname()); in Zeile 2 (d. H. Über alles) hinzu.

  2. Führen Sie php artisan von der Befehlszeile aus. Sie erhalten einen String-Dump mit Ihrem Hostnamen. In meinem Fall "TSE-Win7";

  3. Entfernen Sie die Änderungen an der artisan.php-Datei

  4. Fügen Sie Ihren Hostnamen (z. B. "TSE-Win7") zu den Umgebungen hinzu.

Sie sollten mit so etwas enden:

$environments = array(
  'development' => array('*.dev', 'TSE-Win7'),
  'production' => array('*.com'),
);

Artisan läuft jetzt mit Ihrer Entwicklungsumgebung. Wenn Sie die Bereitstellung auf einem Live-Server durchführen, führen Sie diese Schritte erneut aus, um den Hostnamen () für den Server abzurufen, und Sie können eine spezielle Handwerkskonfiguration nur für den Server konfigurieren!

Für Laravel 4:

Die Standardumgebung ist immer production. In Ihrer Datei start.php können Sie jedoch zusätzliche Umgebungen definieren.

 $env = $app->detectEnvironment(array(
   'local' => array('your-machine-name'),
));

Unter Linux und Mac können Sie Ihre hostname durch den Typ hostname in Ihrem Terminal ermitteln - es wird der Name Ihres Computers ausgegeben. Unter Windows setzen Sie dd(gethostname()); am Anfang Ihrer routes.php-Datei - und führen Sie die Website einmal aus. - Sie erhalten den aktuellen Hostnamen Ihres Computers.

Um die aktuelle Umgebung als Variable in Ihrer Anwendung abzurufen - lesen Sie diese Antwort SO hier. Laravel 4: Wie kann ich den Umweltwert erhalten?

Für Laravel 5:

Es gibt eine einzige Konfigurationsdatei mit dem Namen .env in Ihrem Stammverzeichnis . Schauen Sie sich diese Laracast , config vollständig an.

64
Laurence

wenn Sie den Handwerker (Befehlszeile für Laravel) verwenden, müssen Sie jeden Befehl hinzufügen, den Sie hinzufügen müssen 

artisan bla bla bla --env=Development 

oder

artisan bla bla bla --env=Production
8
Knight

Hier ist, wie ich es für meine Bedürfnisse eingerichtet habe. 

Ich persönlich brauche 4 verschiedene Konfigurationen:

  1. localhost (Mac OSX) - /Library/WebServer/Documents/www/my-domain.com/development/ 
  2. dev.my-domain.com (VPS) - /var/www/my-domain.com/development/
  3. test.my-domain.com (VPS) - /var/www/my-domain.com/test/
  4. my-domain.com (VPS) - /var/www/my-domain.com/web/

Da in allen vier Umgebungen eine eindeutige Verzeichnisstruktur vorhanden ist, kann ich die App-Verzeichnisse mit der magischen Konstante _DIR_ von php abrufen und dann mit der Funktion strpos () eine einfache Überprüfung durchführen und die entsprechende Umgebung zurückgeben. Es kümmert sich auch um die Artisan-Umgebung, Sie müssen die Umgebung nicht manuell eingeben oder Maschinennamen hinzufügen.

In der 

bootstrap/start.php

Fügen Sie eine Rückruffunktion hinzu

$env = $app->detectEnvironment(function(){

  $haystack = __DIR__; // Catch the directory path

  // Set the booleans (remove the first '/', else strpos() will return 0)
  $isLocal       = strpos($haystack, 'Library/WebServer/Documents/www/my-domain.com/development/');
  $isDevelopment = strpos($haystack, 'var/www/my-domain.com/development/');
  $isTest        = strpos($haystack, 'var/www/my-domain.com/test/');
  $isProduction  = strpos($haystack, 'var/www/my-domain.com/web/');

  // Set the environments
  if ($isLocal)       $environment = "local";
  if ($isDevelopment) $environment = "development";
  if ($isTest)        $environment = "test";
  if ($isProduction)  $environment = "production";

  // Return the appropriate environment
  return $environment
});

Eine andere Alternative

Wir können auch alle Werte auf einmal in ein Array setzen und speichern und eine foreach-Schleife ausführen.

Tipp: Da wir die Funktion strpos () verwenden, wird die Position des ersten Vorkommens des angegebenen Werts mit dem $ haystack überprüft und die Positionsnummer zurückgegeben. Wir müssen nicht wirklich den gesamten Pfad angeben, sondern können einfach einen eindeutigen Wert von jedem Pfad hinzufügen, um die Arbeit zu erledigen. 

// Check the boolean, if true set to given value, else set NULL
$environments[] = strpos($haystack, "Library") ? 'local'      : NULL;
$environments[] = strpos($haystack, "develop") ? 'development': NULL;
$environments[] = strpos($haystack, "test")    ? 'test'       : NULL;
$environments[] = strpos($haystack, "web")     ? 'production' : NULL;

// Loop through each, if not null then we have our environment
foreach ($environments as $environment) {
     if(!is_null($environment))
     return $environment;
}

Egal, ob wir auf einem oder mehreren Rechnern arbeiten, die Chancen, denselben Pfad zu unterschiedlichen Umgebungen zu haben, sind sehr gering. 

Oder so denke ich. :)

4
Faiyaz Haider

So richten Sie eine umgebungsspezifische Konfiguration ein befindet sich jetzt in den offiziellen Laravel-Dokumenten. Ich würde empfehlen, ihre Methode anstelle der akzeptierten Antwort zu verwenden:

Es ist oft hilfreich, unterschiedliche Konfigurationswerte basierend auf .__ zu verwenden. die Umgebung, in der die Anwendung ausgeführt wird. Beispielsweise können Sie Ich möchte auf Ihrem lokalen Entwicklungscomputer einen anderen Cache-Treiber verwenden als auf dem Produktionsserver. Dies kann leicht mit .__ erreicht werden. umgebungsbasierte Konfiguration.

Erstellen Sie einfach einen Ordner innerhalb des Konfigurationsverzeichnisses, der Ihrem .__ entspricht. Umgebungsname, z. B. lokal. Als Nächstes erstellen Sie die Konfigurationsdateien Sie möchten die Optionen für diese Umgebung überschreiben und angeben. Zum B. den Cache-Treiber für die lokale Umgebung überschreiben, erstellt eine cache.php-Datei in app/config/local mit der folgenden Inhalt:

<?php    
return array(    
    'driver' => 'file',    
);

Hinweis: Verwenden Sie 'testing' nicht als Umgebungsnamen. Dies ist reserviert zur Stückprüfung. Beachten Sie, dass Sie nicht jede Option angeben müssen Das ist in der Basiskonfigurationsdatei, aber nur die gewünschten Optionen überschreiben. Die Umgebungskonfigurationsdateien werden über .__ "kaskadiert". die Basisdateien.

Als Nächstes müssen wir dem Framework zeigen, wie es bestimmt werden soll. Umgebung, in der es ausgeführt wird. Die Standardumgebung ist immer Produktion. Sie können jedoch andere Umgebungen innerhalb von .__ einrichten. bootstrap/start.php -Datei im Stammverzeichnis Ihrer Installation. In diesem Datei finden Sie einen Aufruf von $ app-> detectEnvironment. Das Array übergeben Mit dieser Methode wird die aktuelle Umgebung ermittelt. Du darfst Fügen Sie dem Array bei Bedarf weitere Umgebungen und Computernamen hinzu.

<?php

$env = $app->detectEnvironment(array(    
    'local' => array('your-machine-name'),    
));

In diesem Beispiel ist 'local' der Name der Umgebung und 'Ihr-Computername' ist der Hostname Ihres Servers. Unter Linux und Mac Sie können Ihren Hostnamen mit dem Terminalbefehl Hostname ermitteln.

Wenn Sie eine flexiblere Umgebungserkennung benötigen, können Sie eine .__ übergeben. Schließung der detectEnvironment-Methode, sodass Sie .__ implementieren können. Umgebungserkennung, wie Sie möchten:

$env = $app->detectEnvironment(function()
{ 
    $domain = explode('.', $_SERVER['HTTP_Host']);
    switch($domain[0])
    {
        case 'localhost':
        case 'localhost:8080':                
        case 'dev':
            return 'development';
            break;
        case 'mysite':
        default:
            return 'production';
            break;
    }
});

Sie können über die Umgebung auf die aktuelle Anwendungsumgebung zugreifen Methode:

Zugriff auf die aktuelle Anwendungsumgebung

$environment = App::environment();

Sie können auch Argumente an die Umgebungsmethode übergeben, um zu prüfen, ob Umgebung entspricht einem bestimmten Wert:

if (App::environment('local'))
{
    // The environment is local
}

if (App::environment('local', 'staging'))
{
    // The environment is either local OR staging...
}
2
Justin

Laravel 5

Verwenden Sie den DotEnv - Ansatz, der in den Laravel-Dokumenten hier beschrieben wird.

Laravel 4

Wir verwenden die von Jeffrey Way empfohlene Methode in dieser Laracasts-Lektion .

  • Erstellen Sie config Verzeichnisse für jede Umgebung .

    /app
        /config
            /local
                database.php
            /production
                database.php
    
  • Legen Sie eine Umgebungsvariable auf Ihrem Produktionsserver fest. Google für den besten Ansatz auf Ihrer Produktionsplattform. Hier sind zum Beispiel tolle Vorschläge für Ubuntu , Dreamhost und Heroku . Wir haben eine einzelne Zeile zu /etc/environment hinzugefügt:

    ENV=production
    
  • Fügen Sie diese Schließung zu /bootstrap/start.php hinzu. Bei diesem Setup wird jeder Server, dem die Umgebungsvariable ENV fehlt, standardmäßig die Umgebungsvariable local verwendet.

    $env = $app->detectEnvironment(
        function () {
            return getenv('ENV') ? : 'local';
        }
    );
    
2
Troy Harvey

Ich habe heute daran gearbeitet und versucht, herauszufinden, wie man am besten die Umgebungseinstellungen für eine Datenbank vornimmt. Nachdem ich verschiedene Methoden ausprobiert habe, stimme ich @ troy-harvey zu, dass Jeffrey Ways Empfehlung, dies zu tun, die beste ist (zumindest für mich). Eine Sache, die ich hinzufügen möchte, ist das, was mich heute so sehr aufgehalten hat ( und korrigiere mich, wenn ich falsch liege ), dass Sie auf die Einstellungen zugreifen müssen, die Sie in Ihren Umgebungseinstellungen überschreiben möchten Datei mit ihren entsprechenden Array-Schlüsseln. Ich habe ein einfaches Array zurückgegeben:

return [
    'database' => '<db_name>',
    'username' => '<db_user>',
    'password' => '<db_pass>',
]; 

innerhalb eines app/config/staging/database.php. Dies hatte keine Auswirkungen und nach vielen Kopfkratzern wurde klar, dass Sie auf das Array zugreifen müssen, wie es in app/config/database.php dargestellt ist.

<?php

return [
'connections' => [
    'mysql' => [
        'database' => '<db_name>',
        'username' => '<db_user>',
        'password' => '<db_pass>'
    ]
  ]
];

Zumindest habe ich es schließlich geschafft, meine Einstellungen abrufen zu können. 

Fügen Sie dies hier hinzu, falls andere Probleme haben, dies herauszufinden. Nach der Erkenntnis verstand ich, wie offensichtlich ein Fehler war, den ich machte. 

Bearbeitet am 01. Juli 2014

Ein zusätzlicher Kommentar dazu ist, dass Laravel seit 4.1 eine Hilfsfunktion append_config () zum Anhängen von Umgebungskonfigurationen an das Hauptkonfigurationsarray enthält. 

Dies würde für das oben angegebene Beispiel so aussehen:

<?php

return append_config([
     'connections' => [
        'mysql' => [
             'database' => '<db_name>',
             'username' => '<db_user>',
             'password' => '<db_pass>'
        ]
      ]
   ]);

1
Schneidey

In Laravel 3 war es zum Erkennen der Umgebung:

Request:env()

Was würde das zurückgeben, was im Umgebungs-Array in der Datei paths.php gefunden wurde.

Wie bereits in Laravel 4 erwähnt, ist es jetzt:

App:: environment()
0
Robert Brisita

Wenn Sie sich auf Laravel 4 hier ist ein Gist befinden, werden Sie Schritt für Schritt durch den Prozess geführt. Dank an die Antwort von @ "The Shift Exchange", die mich dazu gebracht hat, sie zu erstellen.

0
TechyTimo

Meine Art, es zu tun!

$env = $app->detectEnvironment( function() {
    if ( file_exists('../.env.local.php') ) {
        return 'local';
    }
    if ( file_exists('../.env.beta.php') ) {
        return 'beta';
    }
    return 'production';
} );
0
Abi Xalmon

Wenn Sie versuchen, Laravel in einer Windows-Umgebung zu verwenden, überprüfen Sie die Einstellungen in der Datei .env im Ordner der obersten Ebene für Ihr Laravel-Projekt. Diese Einstellungen überschreiben die in der Datei config/database.php vorhandenen Datenbankeinstellungen

0
Phil Pearce