PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Lumen - Criar conexão de banco de dados em tempo de execução


Há um problema principal com o método que você está seguindo:

Você não inicializou nenhum objeto de configuração. Lumen, por padrão, não tem um conjunto de objetos de configuração tradicional, até que você crie um config diretório em sua pasta raiz.

Conforme escrito nos documentos de configuração do Lumen:

Todas as opções de configuração da estrutura Lumen são armazenadas no arquivo .env.

A abordagem que você está procurando requer o objeto de configuração tradicional usado no Laravel.

Para obter esse objeto e seu novo retail_db conexão de banco de dados funcionando:
  • Crie uma config pasta na raiz do seu projeto
  • Copie o arquivo vendor/laravel/lumen-framework/config/database.php para esta pasta de configuração
  • Inicie o objeto de configuração do banco de dados em seu bootstrap/app.php com $app->configure('database'); (coloque na linha 28)

Sua estrutura de pastas está assim agora:
├── app
├── bootstrap
├── config
   └── database.php
├── database
├── public
├── resources
├── storage
├── tests
└── vendor

Claro que você pode remover as conexões que você não precisa do array de conexões em app/config/database.php comentando ou removendo-os completamente.

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

Seu bootstrap/app.php com as mudanças:
/*
|--------------------------------------------------------------------------
| 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');

Agora você pode usar o código que já tem em seu routes.php .

Para excluir seu retail_db conexão, basta configurá-la para null :
$config->set('database.connections.retail_db', null);