首页 > 解决方案 > 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

标签: phplaravelconfiguration

解决方案


您可以动态设置数据库。这将覆盖.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,
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

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

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

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

推荐阅读