php - 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
解决方案
您可以动态设置数据库。这将覆盖.evn
并config/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,
];
现在测试一下!如果您有两个数据库laravel
和stTest
. 用户表中的名称字段stTest
也是laravel
如此。
Route::get('/stTest', function () {
return User::first()->name; //stTest
});
Route::get('/laravel', function () {
return User::first()->name; //laravel
});
推荐阅读
- ios - 在 Swift 中解析 Javascript new Date().toString()
- node.js - 在计算字段 Mongoose 上的路径中,值“NaN”(类型编号)转换为数字失败
- ecmascript-6 - req.file.stream 未定义
- android - 通过拦截器在查询参数之前添加值
- javascript - 牙套有什么特殊用途吗?
- django - 从 url 中获取一个值以将其设置为表单的值?
- reactjs - 如何访问 yup 对象内的输入值?
- apache-nifi - 如何使从 ListFile 处理器接收到的流文件等到其中一个特定流文件(如果存在)的处理完成?
- php - 如何仅在 Google Drive API 中列出所有共享文件夹和文件?
- sql - 在 SQL 中遇到嵌套的 where、group by 和 min/max