2016-06-20 13 views
0

Ich erstelle eine App und ich plane, Benutzern eine Ein-Klick-Installationsfunktion zu geben. Die Idee ist, ein Formular beim ersten Start der Anwendung zu zeigen, eine Art Installations-/Konfigurationsbildschirm, wo der Benutzer Datenbankdetails (Hostname, Datenbankname, Benutzername & Passwort) eingibt und Benutzerdetails (E-Mail, Benutzername und Passwort für den Standardadministrator) eingibt Konto). Sobald er das Formular wird, möchte ich folgende Aufgaben:Laravel 5.2: Aktualisieren Sie die .env-Datei mit Benutzereingaben und führen Sie Migrationen durch Code

  1. aktualisieren .env Datei mit Hostnamen, DB-Name, Benutzername & Passwort
  2. Run alle Migrationen
  3. Run alle db: Samen
  4. Erstellen Sie einen Benutzer basierend auf Benutzereingabe (das ist nicht viel von einem Problem)

Ist es möglich, über Code zu tun? Ich habe versucht, das zu googlen, kann aber keine Hilfe finden.

Wie der Titel sagt, verwende ich L5.2 für dieses Projekt.

Antwort

1

So, hier ist die endgültige Lösung zu verwenden.

Mein Controller:

use Illuminate\Support\Facades\Artisan; 
use Illuminate\Support\Facades\Storage; 

class TestController extends Controller 
{ 
    public function index() { 

     // Values I want to insert 
     $data = [ 
      'APP_KEY'  => str_random(32), 
      'DB_HOST'  => 'localhost', 
      'DB_DATABASE' => 'lara_test', 
      'DB_USERNAME' => 'root', 
      'DB_PASSWORD' => '' 
     ]; 

     // default values of .env.example that I want to change 
     $defaults = ['SomeRandomString', '127.0.0.1', 'homestead', 'homestead', 'secret']; 

     // get contents of .env.example file 
     $content = file_get_contents(base_path() . '/.env.example'); 

     // replace default values with new ones 
     $i = 0; 
     foreach ($data as $key => $value) { 

      $content = str_replace($key.'='.$defaults[$i], $key.'='.$value, $content); 
      $i++; 
     } 

     // Create new .env file 
     Storage::disk('root')->put('.env', $content); 

     // run all migrations 
     Artisan::call('migrate'); 

     // run all db seeds 
     Artisan::call('db:seed'); 

     dd('done'); 

    } 

} 

neue Festplattentreiber:

Um eine neue Datei im Projektstamm zu schaffen, hatte ich einen neuen Disk-Treiber zu erstellen. Ich habe folgenden Code in meiner config/app.php Datei:

'disks' => [ 

    ..... 

    'root' => [ 
     'driver' => 'local', 
     'root' => base_path(), 
    ], 

], 

und dies ermöglichte mir, neue Datei an der Wurzel zu erstellen, indem Sie mit:

Storage::disk('root')->put('filename', $content); 

Zusammenfassung:

Also im Grunde bin ich immer die Inhalt von .env.example Datei, Ändern der Werte der Konstanten, die ich will und dann Erstellen einer neuen .env Datei. Danach habe ich alle meine Wanderungen und Samen ausgeführt.

Hinweis: ich manuell den APP_KEY eingestellt musste wegen eines dummen Fehler No supported encrypter found. The cipher and/or key length are invalid.

Da ich versuche, alles in Code zu tun, nicht durch Befehle - Ich habe versucht, Artisan::call('key:generate'); verwenden, aber aus unerfindlichen Gründen nicht funktioniert, um das Problem zu beheben, musste ich manuell eine zufällige Zeichenfolge erstellen, die 32 Bit lang ist und es als APP_KEY festlegen.

Ich hoffe, dies wird jemand anderem helfen. :) Und dank @rypskar für die Hilfe.

1

Alles kann mit Code erfolgen;)

Sie ein sh-Skript schreiben können, die Sie von Ihrem Code aufrufen oder Sie können diese aus dem Code direkt tun.

  1. Ich habe keine Funktionen zum Kopieren und bevölkern .env Datei gesehen, aber man konnte den Inhalt vor dem Schreiben die neue Datei zurück auf der Festplatte liest .env.example mit file_get_contents() und aktualisieren.
  2. \Illuminate\Support\Facades\Artisan::call('migrate');
  3. \Illuminate\Support\Facades\Artisan::call('db:seed'); (Nicht da ich nur das von einem Test gemacht hat getestet, wo es möglich ist, nach dem Spielen mit diesem um $this->seed();
  4. User::create(['column', => $value])
+0

Danke für die Hilfe Mate. – Jazzbot