2016-05-13 7 views
3

In einem Lumen-Projekt muss ich Datenbankverbindungen zur Laufzeit erstellen, aber immer bekomme ich einen Fehler "Datenbank [...] nicht konfiguriert", jedes Mal wenn ich versuche, ein kürzlich erstelltes zu verwenden Verbindung.Lumen - Erstellen einer Datenbankverbindung zur Laufzeit

Dies ist mein Testcode auf routes.php:

<?php 

$app->get('/', function() use ($app) { 

    $config = $app->make('config'); 
    $config->set('database.connections.retail_db', [ 
     'driver' => 'pgsql', 
     'host'  => env('RETAIL_DB_HOST', 'localhost'), 
     'port'  => env('RETAIL_DB_PORT', 5432), 
     'database' => env('RETAIL_DB_DATABASE', 'forge'), 
     'username' => env('RETAIL_DB_USERNAME', 'forge'), 
     'password' => env('RETAIL_DB_PASSWORD', ''), 
     'charset' => env('RETAIL_DB_CHARSET', 'utf8'), 
     'prefix' => env('RETAIL_DB_PREFIX', ''), 
     'schema' => env('RETAIL_DB_SCHEMA', 'public'), 
    ]); 
    return app('db')->connection('retail_db')->select("SELECT * FROM users"); 

}); 

Dieser Code soll auf Laravel arbeiten, aber ich kann keine Informationen über Lumen finden.

Ich verwende die neueste Lumen-Version.

+0

https://lumen.laravel.com/docs/5.2/database –

+0

@ClaudioKing ich die Dokumentation gelesen haben, aber wenn doesn Sagen Sie nichts über Datenbankverbindungen zur Laufzeit. – BernalCarlos

Antwort

3

Es ist ein Hauptproblem bei der Methode, die Sie für gehen:

Sie kein Konfigurationsobjekt initialisiert wurden. Lumen verfügt standardmäßig über kein traditionelles Konfigurationsobjekt, bis Sie ein Verzeichnis config in Ihrem Stammordner erstellen.

Wie in der Lumen configuration docs geschrieben:

alle Konfigurationsoptionen für das Lumen Rahmen werden in der .env-Datei gespeichert.

Der Ansatz, den Sie anstreben, erfordert das traditionelle Konfigurationsobjekt, das in Laravel verwendet wird.

Um dieses Objekt und Ihre neue retail_db Datenbankverbindung Arbeits zu erhalten:

  • erstellen config Ordner in Ihrem Projekt-Stamm
  • Kopieren Sie die Datei vendor/laravel/lumen-framework/config/database.php auf diese Ordner config
  • die Datenbankkonfiguration initialisieren Objekt in Ihrem app/bootstrap.php mit $app->configure('database'); (setzen Sie es in Zeile 28)

Ihre Ordnerstruktur wie folgt aussieht jetzt:

├── app 
├── bootstrap 
├── config 
    └── database.php 
├── database 
├── public 
├── resources 
├── storage 
├── tests 
└── vendor 

Natürlich können Sie diese Verbindungen entfernen können Sie nicht durch Kommentare oder entfernen sie vollständig in app/config/database.php der Verbindungen Array benötigen.

app/config/database.php

'connections' => [ 

     /*'testing' => [ 
      'driver' => 'sqlite', 
      'database' => ':memory:', 
     ],*/ 

     'sqlite' => [ 
      'driver' => 'sqlite', 
      'database' => env('DB_DATABASE', base_path('database/database.sqlite')), 
      'prefix' => env('DB_PREFIX', ''), 
     ], 

     'mysql' => [ 
      'driver' => 'mysql', 
      'host'  => env('DB_HOST', 'localhost'), 
      'port'  => env('DB_PORT', 3306), 
      'database' => env('DB_DATABASE', 'forge'), 
      'username' => env('DB_USERNAME', 'forge'), 
      'password' => env('DB_PASSWORD', ''), 
      'charset' => env('DB_CHARSET', 'utf8'), 
      'collation' => env('DB_COLLATION', 'utf8_unicode_ci'), 
      'prefix' => env('DB_PREFIX', ''), 
      'timezone' => env('DB_TIMEZONE', '+00:00'), 
      'strict' => env('DB_STRICT_MODE', false), 
     ], 

] 

Ihre bootstrap/app.php mit den Änderungen:

/* 
|-------------------------------------------------------------------------- 
| Create The Application 
|-------------------------------------------------------------------------- 
| 
| Here we will load the environment and create the application instance 
| that serves as the central piece of this framework. We'll use this 
| application as an "IoC" container and router for this framework. 
| 
*/ 

$app = new Laravel\Lumen\Application(
    realpath(__DIR__.'/../') 
); 

//$app->withFacades(); 
// $app->withEloquent(); 

$app->configure('database'); 

Jetzt können Sie den Code verwenden Sie bereits in Ihrem routes.php haben.

Um Ihre retail_db Verbindung zu löschen, setzen sie einfach zu null:

$config->set('database.connections.retail_db', null); 
+0

Danke @codedge das ist was ich brauche.Aber aus Neugier, wie kann ich die neu erstellte Verbindung löschen? – BernalCarlos

+1

Zum Löschen gibt es nur den Weg, setzen Sie es auf null - ich aktualisiert, meine Antwort. – codedge