Lumen: crea una conexión de base de datos en tiempo de ejecución

En un proyecto de Lumen, necesito crear conexiones de base de datos en tiempo de ejecución, pero sigo recibiendo un error de […] “Base de datos no configurada”, cada vez que trato de usar una conexión creada recientemente.

Este es mi código de prueba en routes.php:

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"); }); 

Se supone que este código funciona en Laravel, pero no puedo encontrar ninguna información con respecto a Lumen.

Estoy usando la última versión de Lumen.

Hay un problema principal con el método que está buscando:

No inicializó ningún objeto de configuración. Lumen por defecto no tiene un conjunto de objetos de configuración tradicional, hasta que crea un directorio de config en su carpeta raíz.

Como está escrito en los documentos de configuración de Lumen :

Todas las opciones de configuración para el marco de Lumen se almacenan en el archivo .env.

El enfoque al que se dirige requiere el objeto de configuración tradicional tal como se usa en Laravel.

Para que retail_db ese objeto y su nueva conexión de base de datos retail_db :

  • Crea una carpeta config en la raíz de tu proyecto
  • Copie el archivo vendor/laravel/lumen-framework/config/database.php a esta carpeta de configuración
  • Inicialice el objeto de configuración de la base de datos en su app/bootstrap.php con $app->configure('database'); (Ponlo en la línea 28)

La estructura de tu carpeta se ve así ahora:

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

Por supuesto, puede eliminar esas conexiones que no necesita de la matriz de conexiones en app/config/database.php comentando o eliminándolas por completo.

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), ], ] 

Su bootstrap/app.php con los cambios:

 /* |-------------------------------------------------------------------------- | 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'); 

Ahora puedes usar el código que ya tienes en tus routes.php .

Para eliminar su conexión retail_db , simplemente retail_db como null :

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