Lumen - 在运行时创建数据库连接
Lumen - Create database connection at runtime
在 Lumen 项目中,我需要在运行时创建数据库连接,但每次我尝试使用最近创建的连接时,我总是收到 "Database [...] not configured" 错误。
这是我在 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 的信息。
我使用的是最新的 Lumen 版本。
您要采用的方法存在一个主要问题:
您没有初始化任何配置对象。 Lumen 默认情况下没有传统的配置对象集,直到您在根文件夹中创建 config
目录。
All of the configuration options for the Lumen framework are stored in the .env file.
您要采用的方法需要 Laravel 中使用的传统配置对象。
要使该对象和新的 retail_db
数据库连接正常工作:
- 在您的项目根目录中创建一个
config
文件夹
- 将文件
vendor/laravel/lumen-framework/config/database.php
复制到此配置文件夹
- 用
$app->configure('database');
初始化 bootstrap/app.php
中的数据库配置对象(放在第 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);
回答@jhon的问题
Lumen 不提供该配置文件夹,您需要在根目录下创建名为 config
.
的新目录
然后在里面复制@codedge提到的database.php
文件
Copy the file vendor/laravel/lumen-framework/config/database.php to this config folder
在终端中按照以下命令创建 config
目录并复制 database.php
文件
user$ cd projectPath/
user$ mkdir config
user$ cp vendor/laravel/lumen-framework/config/database.php config/database.php
其中 此配置文件夹 是您刚刚创建的 config
目录。
所以它看起来像下图。
folder structure
在 Lumen 项目中,我需要在运行时创建数据库连接,但每次我尝试使用最近创建的连接时,我总是收到 "Database [...] not configured" 错误。
这是我在 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 的信息。
我使用的是最新的 Lumen 版本。
您要采用的方法存在一个主要问题:
您没有初始化任何配置对象。 Lumen 默认情况下没有传统的配置对象集,直到您在根文件夹中创建 config
目录。
All of the configuration options for the Lumen framework are stored in the .env file.
您要采用的方法需要 Laravel 中使用的传统配置对象。
要使该对象和新的 retail_db
数据库连接正常工作:
- 在您的项目根目录中创建一个
config
文件夹 - 将文件
vendor/laravel/lumen-framework/config/database.php
复制到此配置文件夹 - 用
$app->configure('database');
初始化bootstrap/app.php
中的数据库配置对象(放在第 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);
回答@jhon的问题
Lumen 不提供该配置文件夹,您需要在根目录下创建名为 config
.
然后在里面复制@codedge提到的database.php
文件
Copy the file vendor/laravel/lumen-framework/config/database.php to this config folder
在终端中按照以下命令创建 config
目录并复制 database.php
文件
user$ cd projectPath/
user$ mkdir config
user$ cp vendor/laravel/lumen-framework/config/database.php config/database.php
其中 此配置文件夹 是您刚刚创建的 config
目录。
所以它看起来像下图。
folder structure