web-dev-qa-db-ja.com

ルーメン-実行時にデータベース接続を作成します

Lumenプロジェクトでは、実行時にデータベース接続を作成する必要がありますが、最近作成した接続を使用しようとするたびに、「データベース[...]が構成されていません」というエラーが表示され続けます。

これは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");

});

このコードはLaravelで動作するはずですが、Lumenに関する情報が見つかりません。

最新のルーメンバージョンを使用しています。

7
BernalCarlos

あなたがしようとしている方法には1つの主な問題があります:

構成オブジェクトを初期化しませんでした。ルートフォルダにconfigディレクトリを作成するまで、Lumenにはデフォルトで従来の設定オブジェクトが設定されていません。

Lumen構成ドキュメント に書かれているように:

Lumenフレームワークのすべての構成オプションは、.envファイルに保存されます。

目的のアプローチには、Laravelで使用されている従来の構成オブジェクトが必要です。

そのオブジェクトと新しい_retail_db_データベース接続を機能させるには:

  • プロジェクトルートにconfigフォルダーを作成します
  • ファイル_vendor/laravel/Lumen-framework/config/database.php_をこの構成フォルダーにコピーします
  • _bootstrap/app.php_のデータベース構成オブジェクトを$app->configure('database');で初期化します(28行目に配置します)

フォルダ構造は次のようになります。

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

もちろん、コメントを付けるか完全に削除することで、_app/config/database.php_の接続配列から不要な接続を削除できます。

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

bootstrap/app.phpの変更点:

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

これで、_routes.php_に既にあるコードを使用できます。

_retail_db_接続を削除するには、接続をnullに設定します。

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