Laravel应用程序的配置何时初始化?或者当设置了DB::connection时



我有一个中间件,它可以动态更改数据库配置,如下所示:

config(['database.connections.mysql.database'=> 'newDatabaseName']);

在每个模型中,我都显式地设置了$connection = 'mysql'

我的模型构造函数内部:

logger()->info(get_class($this). ' database: ' . config('database.connections.mysql.database'));
logger()->info(get_class($this). ' database: ' . DB::connection($this->connection)->getDatabaseName());

输出为:

newDatabaseName
oldDatabaseName

其中newDatabaseName是我在中间件中设置的数据库,oldDatabasename是.env数据库名称。

因此,基本上我成功地在配置中设置了数据库名称,但由于某种原因,模型仍然使用.env数据库名称。

你知道为什么会这样吗?

我有其他应用于这些路线的中间件:

SubstituteBindings::class,
ChangeLocale::class,
HandleCors::class,

我以为这是因为"SubstituteBinding"中间件,但我试着把我的中间件放在它之前和之后,这没有什么区别。

我正在使用laravel 5.6

您可以动态设置数据库。这将覆盖.evnconfig/database.php文件。

class MyMiddleware
{
public function handle($request, Closure $next)
{
Config::set('database.connections.mysql.database', $request->path());
return $next($request);
}
}

内核

class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
MyMiddleware::class,
AppHttpMiddlewareTrustProxies::class,
FruitcakeCorsHandleCors::class,
AppHttpMiddlewareCheckForMaintenanceMode::class,
IlluminateFoundationHttpMiddlewareValidatePostSize::class,
AppHttpMiddlewareTrimStrings::class,
IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,
];

现在测试一下!如果您有两个数据库laravelstTest。用户表中的名称字段也是stTestlaravel

Route::get('/stTest', function () {
return User::first()->name; //stTest
});
Route::get('/laravel', function () {
return User::first()->name; //laravel
});

Laravel在启动应用程序时获取并存储数组中的配置。

当应用程序启动时,它会读取数据库配置,并根据您将在中间件中覆盖的配置启动数据库连接。因此,更新数据库连接配置不会影响连接本身。

解决方案:

config/database.php中定义多个连接,然后在中间件中设置默认连接名称,而不是设置数据库名称。

config(['database.default' => $connectionName]);

当然,不要在模型中显式地设置连接名称。

我终于发现了发生了什么。DatabaseManager第一次缓存所有连接,这将修复它:

config(['database.connections.mysql.database' => 'newDatabaseName']);
DB::purge('mysql');
DB::reconnect('mysql');

以下是我发现的关于确切问题的帖子:https://divinglaravel.com/understanding-how-laravel-configures-database-connections